2015-08-31 44 views
3

我有可能依賴於其他版本的版本。從屬版本存儲在列表dependsOn中。因爲我需要能夠確定,在其他版本中使用了特定版本,所以我有列表usedIn這是dependsOn的反轉。的EclipseLink實體無法識別

我的問題是一旦我添加方法添加/刪除單個版本從dependsOn EclipseLink不會將我的類Version識別爲實體了。

我的版本類:

@Entity 
@Table(name = "tbl_version") 
@NamedQueries(/*...*/) 
public class Version extends BaseEntity 
{ 
    @ManyToMany 
    @JoinTable(name = "tbl_depends_on", 
     joinColumns = { @JoinColumn(name = "PK_VERSION") }, 
     inverseJoinColumns = { @JoinColumn(name = "PK_DEPENDENCY") } 
    ) 
    private List<Version> dependsOn; 

    @ManyToMany(mappedBy = "dependsOn") 
    private List<Version> usedIn; 

    public void addDependency(Version dependency) 
    { 
     if(dependency == null) 
     { 
      return; 
     } 
     dependsOn.forEach((Version version) -> 
     { 
      if(dependency.equals(version)) 
      { 
       return; 
      } 
     }); 
     dependsOn.add(dependency); 
    } 

    public void removeDependency(Version dependency) 
    { 
     if(dependency == null) 
     { 
      return; 
     } 
     dependsOn.forEach((Version version) -> 
     { 
      if(dependency.equals(version)) 
      { 
       dependsOn.remove(version); 
       return; 
      } 
     }); 
    } 
} 

當我刪除addDependencyremoveDependency的EclipseLink作品再次完美。另外它不是字段usedIn,我已經試圖刪除它。 我使用EclipseLink 2.5作爲持久性api。
有沒有人知道我做錯了什麼?

更新
以下異常被拋出

java.lang.IllegalArgumentException: Object: Version [id=null, 

name=1.2.5] is not a known entity type. 
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.registerNewObjectForPersist(UnitOfWorkImpl.java:4222) 
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.persist(EntityManagerImpl.java:496) 
    at persistence.VersionTest.setUp(VersionTest.java:71) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24) 
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 

71號線是在一個JUnit測試設置的一部分:

@Before 
public void setUp() throws Exception 
{ 
    Version version1 = new Version(); 
    version1.setName(versionName1); 

    Version version2 = new Version(); 
    version2.setName(versionName2); 

    EntityTransaction transaction = manager.getTransaction(); 
    try 
    { 
     transaction.begin(); 
     manager.persist(lVersion1); //line 71 
     //... 
+0

嗯,行爲是看似隨意。愚蠢的測試:如果添加方法但完全註釋掉其中的代碼會怎麼樣?如:如果該類不包含Java 8 lamdas? – Gimby

+0

@Gimby非常感謝,這完全是關於lamdas!我用普通的循環替換它們,現在它正在工作。 – ToxicWaste

+0

我真的希望事實並非如此,因爲現在我真的很想知道爲什麼拉姆達斯會造成問題。 EclipseLink的最新版本是2.6.0,這是否有所作爲?這可能是在你的版本的EclipseLink字節碼設備邏輯不理解Java 8具體的東西還沒有 – Gimby

回答

4

如果你想使用Java 8個Lambda表達式中您的實體代碼,您應該擁有與Java 8字節碼兼容的最新版本的EclipseLink,否則您可能會遇到衝突。使用EclipseLink 2.6.0或更高版本。

問題的根源可以在這個錯誤報告,這是在2.6.0解決了閱讀:

https://bugs.eclipse.org/bugs/show_bug.cgi?id=429992

+0

對於下面這個人,知道的EclipseLink的這些版本(2.6.0,2.6.1)你可以在升級時很容易碰到的問題:https://bugs.eclipse.org/bugs/show_bug.cgi?id = 463629。它不是一個應用程序中斷問題,它只會在啓動時記錄一個惱人的異常。 – Gimby

相關問題