簡體   English   中英

在服務器端調用業務方法返回被管實體時客戶端出錯

[英]Error on client side while calling a business method on server side returning managed entity

我的客戶端應用程序是使用Netbeans RCP的獨立Java應用程序。 客戶端應用程序連接到Glassfish服務器上安裝的遠程EJB。

在服務器端,我有一個業務方法(我用於測試),它應該接受一個實體的實例(該實體尚未持久化或管理),持久化它(使用EntityManagerpersit )。

以下是此方法的外觀:

@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 )存儲在數據庫中。

我在這里粘貼了這個例外。

以下是我注意到的一些事情。

  • 只有在我嘗試返回托管實體時才會發生異常。 如果我更換em.persist()em.merge ,不返回由合並例如返回新的實體,該異常將永遠不會提高。 例如,做一些事情:

     @Override public TestLinkEntity test(TestLinkEntity c) { em.merge(c); return c; } 
  • 僅當返回的實體包含一對多關系時才會發生異常。 例如,以下代碼片段之類的內容不會引發異常:

     @Override public TestAppEntity test(TestAppEntity c) { em.persist(c); return c; } 

    TestAppEntity不包含任何關系。

我確定的事情:

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

編輯:

由於@James的答案,我現在想知道eclispelink.jar中的包javax.persistence和javaee.jar之間的區別是什么。 我應該包括兩者嗎?

包括兩者都會引起麻煩(可能是由於兩個罐子中的包裝名稱相同)。

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

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM