Я пытаюсь использовать следующее сопоставление:
<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>
Но если для параметра инверсия задано значение true, набор элементов всегда пуст. Тем не менее, когда я устанавливаю обратное значение false, он работает нормально.
Кажется, я что-то пропустил. Любые объяснения высоко ценятся.
ДОБАВЛЕНО:
Извините за задержку, я сделал несколько изменений в коде, но я все еще сталкиваюсь с проблемой:
Я сохраняю категорию с 3 элементами в базе данных, но когда я получаю эту категорию обратно, она содержит только один элемент. Вот код:
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());
}