我的客戶端應用程序是使用Netbeans RCP的獨立Java應用程序。客戶端應用程序連接到安裝在Glassfish服務器上的遠程EJB。在服務器端,我有一個應用實體實例的業務方法(我爲測試製作的)(該實體沒有被持久化或管理),堅持它(使用的persit
) 。客戶端在調用服務器端的業務方法返回被管實體時出錯
下面是這個方法的樣子:
@Override
public TestLinkEntity test(TestLinkEntity c) {
em.persist(c);
return c;
}
從客戶端調用是這樣的:
TestLinkEntity c = remote.test(new TestLinkEntity());
這裏是TestLinkEntity
聲明:
@Entity
public class TestLinkEntity implements AltEntity, Serializable {
private Set<TestAppEntity> links = new HashSet<TestAppEntity>();
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Override
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@OneToMany(mappedBy="links")
public Set<TestAppEntity> getLinks() {
return links;
}
}
而且現在的TestAppEntity
用於一對多關係。
@Entity
public class TestAppEntity implements Serializable, AltEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String test;
public TestAppEntity() {
}
@Override
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getTest() {
return test;
}
public void setTest(String test) {
this.test = test;
}
}
我現在面臨的問題是,當我嘗試調用來自客戶端的業務方法(如上圖所示),我收到了客戶端在客戶端一個巨大和相當不可讀例外,只 。 Glassfish日誌和實體(TestLinkEntity
)和潛在鏈接(TestAppEntity
)中都沒有記錄異常存儲在數據庫中。
我粘貼了異常here。
這裏有幾件事我注意到了。
只有當我嘗試返回託管實體時纔會發生異常。如果我將
em.persist()
替換爲em.merge
,並且不返回通過合併返回的新實體,則絕不會引發異常。 e.g這樣做:@Override public TestLinkEntity test(TestLinkEntity c) { em.merge(c); return c; }
的異常,只有當實體返回包含一對多關係發生。 e.g類似下面的代碼片段將不會產生異常:
@Override public TestAppEntity test(TestAppEntity c) { em.persist(c); return c; }
TestAppEntity不包含任何關係。
事情,我敢肯定:
TestAppEntity
和TestLinkEntity
都在客戶端和服務器端相同。
編輯:
由於@詹姆斯的回答,我現在不知道是什麼eclispelink.jar和javaee.jar包javax.persistence
之間的差異。我應該包括兩個嗎?
包括這兩個原因麻煩(也許是由於兩個罐子裏的包名稱相同)。
error: in class file javax/persistence/NamedQuery.class(javax/persistence:NamedQuery.class): unknown enum constant javax.persistence.LockModeType.NONE
Note: Attempting to workaround javac bug #6512707
warning: No processor claimed any of these annotations: [javax.ejb.Remote]
error: in class file j javax/persistence/NamedQuery.class(javax/persistence:NamedQuery.class): unknown enum constant javax.persistence.LockModeType.NONE
嗡嗡聲。我的客戶端上已經有一個javaee.jar,其中包含javax.persistence包,就像eclispelink.jar一樣,也添加了兩個jar導致的麻煩。 – nathan
編輯該問題。 – nathan
我在客戶端添加了以下jar包:eclipselink.jar,eclipselink-modelgen_2.4.1 [...]。jar,來自最新eclipselink安裝程序的javax.persistence *。問題依然存在。如果服務器和客戶端版本不同,這有什麼關係?我在2.3.2服務器上。 – nathan