2012-11-07 10 views
0

我的客戶端應用程序是使用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不包含任何關係。

事情,我敢肯定:

  • TestAppEntityTestLinkEntity都在客戶端和服務器端相同。

編輯:

由於@詹姆斯的回答,我現在不知道是什麼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 

回答

2

這似乎是您正在使用的CORBA序列化中的一些錯誤。

我的猜測是你的客戶端上沒有eclipseLink.jar,但你需要它。從數據庫讀取的對象將包含特殊的LAZY集合實例。

+0

嗡嗡聲。我的客戶端上已經有一個javaee.jar,其中包含javax.persistence包,就像eclispelink.jar一樣,也添加了兩個jar導致的麻煩。 – nathan

+0

編輯該問題。 – nathan

+0

我在客戶端添加了以下jar包:eclipselink.jar,eclipselink-modelgen_2.4.1 [...]。jar,來自最新eclipselink安裝程序的javax.persistence *。問題依然存在。如果服務器和客戶端版本不同,這有什麼關係?我在2.3.2服務器上。 – nathan

相關問題