我將帶有註解映射的NHibernate XML映射轉換爲Java的一些C#,並且存在一個我試過轉換沒有成功的實體。我們有一個MAIN_TABLE,一個JOIN_TABLE和一個THIRD_TABLE。來自MAIN_TABLE的一條記錄可以有許多來自THIRD_TABLE,並且它們的關係存儲在JOIN_TABLE中,JOIN_TABLE只有三列:由MAIN_TABLE和THIRD_TABLE中的鍵組成的主鍵,以及包含一些不相關的附加數據的第三行。原來這是NHibernate的XML映射:使用帶註釋的複合主鍵進行元素映射
<class name="MainTable" table="MAIN_TABLE" mutable="false">
<id name="Id" column="rvcplc" type="int" length="10">
<generator class="assigned"/>
</id>
<bag name="JoinedRecords" table="JOIN_TABLE" order-by="main_table_id">
<key column="main_table_id" not-null="true"/>
<composite-element class="JoinTable">
<parent name="parentRecord"/>
<many-to-one name="ThirdTable" column="third_table_id"/>
</composite-element>
</bag>
這是我的代碼的當前狀態:
@Entity()
@Table(name="MAIN_TABLE")
@Immutable
public class MainTable extends BusinessEntity implements IMainTable
{
@Id
@Type(type = "LongToNull")
@Column(name = "id")
private long id;
@ElementCollection
@CollectionTable(name="JOIN_TABLE", joinColumns={@JoinColumn(name="main_table_id")})
private List<IJoinTable> joinedRecords = new ArrayList<IJoinTable>();
}
@Embeddable()
@Table(name = "JOIN_TABLE")
@Immutable
public class JoinTable implements Serializable, IJoinTable
{
@SuppressWarnings("unused")
@Id
private JoinTablePK pkId;
@Parent
@Column(name = "main_table_id")
private IMainTable parentRecord;
@ManyToOne(targetEntity = ThirdTable.class)
@JoinColumn(name = "third_table_id")
private IThirdTable thirdTable;
public static class JoinTablePK implements Serializable
{
// foo
}
}
當我嘗試單元測試這種關聯,只需加載已知MainTable實體,並聲稱它在其集合中有三個子JoinTable對象失敗,出現「無法初始化集合」錯誤。不過,這是我最好的代碼,因爲其他嘗試已經使我所有的測試都失敗了,因爲它在映射錯誤時發生。
首先,感謝您的回答。可悲的是,「不相關的附加數據」必須進行映射,因爲它與關係無關,但包含的數據必須在代碼中使用。所以我試過你的第二個例子,我得到一個「AnnotationException:JoinTable $ JoinTablePK沒有持久性id屬性」任何想法? – CMPerez 2014-11-03 09:39:06
我知道它不會工作,因爲它:)通過查看類似的問題,你有'getTablePK'類,'mainTableId'和'thirdTableId'的getter和setter? – 2014-11-03 10:06:11
@Picacodigos我已經添加了'JoinTablePK'代碼以供參考,以獲得完整的圖片和下一次嘗試的完整基礎 – 2014-11-03 10:43:31