2013-10-21 29 views
0

我試圖在相當複雜的OSGi環境中使用JPA設置一個簡單的外鍵關係。JPA @OneToOne與不從其OSGi包導出的實體

兩個實體我想用成捆的構成就像這樣:

masterbundle 
|->org.masterpackage.persistence 
    |-> MasterEntityDto.java 
slavebundle 
|->org.slavepackage.persistence 
    |-> SlaveEntity.java 

SlaveEntity要參考MasterEntityDto像這樣

@Entity(name = "SlaveEntity") 
public class SlaveEntity { 
    @Id 
    @Column(name = "slaveID") 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private long id; 

    @OneToOne 
    @JoinColumn(name = "masterEntity_id") 
    private MasterEntity masterEntity; 
    // snip.. 
} 

現在,這種失敗,因爲masterbundle沒有出口MasterEntityDto(或其包裝),我想。我們正在使用OSGi的服務方面,masterBundle是provide-interface -ing a 服務使用Dto而不是Dto。 的例外,我看的時候包開始說,除其他事項外org.osgi.framework.BundleException: Unresolved constraint in bundle slavebundle [121]: Unable to resolve 121.8: missing requirement [121.8] osgi.wiring.package;

問題:如何創建從SlaveEntityMasterEntityDto一個@OneToOne關係?這在使用OSGi服務平臺時是不可能的,我只公開服務而不是整個捆綁包/包?

編輯1 根據要求:MasterEntityDto沒有什麼幻想。

@Entity(name = "MasterEntityDto") 
public class MasterEntityDto { 
@Id 
@Column(name = "id", length = 128) 
private String masterId; 
// snip 
} 

我希望JPA做出SlaveEntity - 表SlaveId列(這是本臺PK)和masterEntity_id這將作爲外鍵,指着桌子MasterEntityDtoid列。

+0

你可以顯示你的'MasterEntityDto'的代碼嗎?數據庫中的哪一列包含外鍵? – Uooo

+0

我用'MasterEntityDto'代碼更新了我的帖子。我不確定這是否真的相關。還試圖描述表應該是什麼樣子。我說的是單向一對一的關係,因爲我無法修改'MasterEntityDto'。我只是想加強它。此外,針頭說,實際的代碼是不同的 - 更復雜,併爲此張貼長。這只是它的本質。 – albifant

回答

1

包含域類(如MasterEntityDto)的軟件包確實需要導出,以便JPA軟件包具有可見性以實例化它們。

因此,將這些軟件包與包含實現/邏輯代碼的其他軟件包分開是非常重要的,這些代碼應該是私有的。

+0

我明白了。 但是,使用OSGi服務平臺只能將接口暴露給服務組件(使用''-definition中的'')。這意味着,如果我想正確使用JPA,我不能單獨依賴服務功能,而需要OSGi組件功能來公開某些包(在'manifest.mf'中使用'export-package')。對?只要確保我正確理解了OSGi + JPA。 – albifant

+1

是的。添加此句子以滿足StackOverflow最小注釋大小規則。 –

+0

跟進問題。我仍然無法工作。我一直得到:'[SlaveEntity]在關係中使用非實體[MasterEntity]作爲目標實體...'。然而'MasterEntity'是你看到的一個工作實體。兩個實體都在各自的'persistence.xml'中定義。是否有可能只是導出'MasterEntity's包不會執行,因爲它不包含'MasterEntity'的persistence.xml? (這將在捆綁中,而不是在一個包中)。 – albifant