次のマッピングを使用しようとしています:
<class name="Category" table="CATEGORY" lazy="false">
<id name="id" type="java.lang.Long" >
<column name="ID" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String"/>
<set name="items" inverse="true" lazy="false" access="field" cascade="all">
<key column="id" not-null="true"></key>
<one-to-many class="Item" />
</set>
</class>
ただし、inverse が true に設定されている場合、アイテムのセットは常に空です。ただし、逆を false に設定すると、正常に動作します。私は何かを逃したようです。どんな説明でも大歓迎です。
追加した:
遅れて申し訳ありませんが、コードにいくつかの変更を加えましたが、まだ問題に直面しています: 3 つのアイテムを含むカテゴリをデータベースに保存していますが、そのカテゴリを取得すると、1 つのアイテムしか含まれていません。コードは次のとおりです。
public class Category {
private long id;
private int version;
private String name;
private Set<Item> items;
public Category() {
this.items = new HashSet<Item>();
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public int getVersion() {
return version;
}
public void setVersion(int version) {
this.version = version;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void addItem(Item item) {
this.items.add(item);
item.setCategory(this);
}
public Set<Item> getItems() {
return items;
}
}
<hibernate-mapping >
<class name="Category" table="HIA_CATEGORY" lazy="false">
<id name="id" type="java.lang.Long" >
<column name="ID" />
<generator class="native" />
</id>
<version name="version" column="VERSION" ></version>
<property name="name" type="java.lang.String"/>
<set name="items" inverse="true" lazy="false" access="field" cascade="all" outer-join="false">
<key column="id" not-null="true"></key>
<one-to-many class="Item" />
</set>
</class>
</hibernate-mapping>
public class Item {
protected long id;
protected String name;
protected Category category;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Category getCategory() {
return category;
}
public void setCategory(Category category) {
this.category = category;
category.getItems().add(this);
}
}
<hibernate-mapping>
<class name="Item" table="HIA_ITEM" lazy="false"
abstract="false" polymorphism="implicit">
<id name="id" type="java.lang.Long">
<column name="ID" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String" />
<many-to-one name="category" update="true" cascade="save-update" access="field" lazy="false" outer-join="false"
class="Category" column="CATEGORY">
</many-to-one>
<joined-subclass name="ExtItem"
table="EXT_ITEM" >
<key column="id"></key>
<property name="extProperty" column="EXT_PROPERTY"></property>
</joined-subclass>
</class>
</hibernate-mapping>
前もって感謝します。
編集(著者のコメントによると、Stefan Steineggerによる)
テストケース:
@Test public void lazyInitTest()
{
Category cat = new Category();
cat.setName("CTAEGORY_WITH_ITEMS");
Item item = new Item();
item.setName("ITEM1");
Item item2 = new Item();
item2.setName("ITEM2");
Item item3 = new Item();
item3.setName("Test");
cat.addItem(item);
cat.addItem(item2);
cat.addItem(item3);
categoryDao.persistCategory(cat);
Category category = categoryDao.getCategory(cat.getId());
System.out.println(cat.getId() + "--" + category.getId());
Assert.assertEquals(cat.getItems().size(), category.getItems().size());
}