Hibernate inverse = '' true 'и проблемы при получении один ко многим - PullRequest
0 голосов
/ 04 июня 2011

Я пытаюсь использовать следующее сопоставление:

<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()); 
}

Ответы [ 3 ]

1 голос
/ 06 июня 2011

Устанавливать обратное значение true только в случае двунаправленного отношения. Инверсия означает, что набор не сохраняется, поскольку в памяти существует избыточное отношение.

Редактировать И, конечно, оно должно быть отображено в том же поле базы данных:

Набор переходит на id:

<set name="items" ...>
    <key column="id" not-null="true"/>
    <one-to-many  class="Item"  />
</set>

и множество к одному переходит к CATEGORY:

<many-to-one ... column="CATEGORY">
</many-to-one>

Также измените набор на CATEGORY, чтобы решить проблему:

<set ...>
    <key column="CATEGORY" not-null="true"/>
    <one-to-many  class="Item"  />
</set>
0 голосов
/ 06 июня 2011

После того, как вы сохранили категорию с 3 элементами в базе данных, вы проверили, правильно ли были написаны все элементы (как в случае с другим инструментом, и выбрали элементы, проверяя столбец category_id)?Если да: проверяли ли вы журналы гибернации для сгенерированных SQL-операторов?

Если да: все ли в порядке?Я вижу это повсюду.На самом деле я никогда не делал этого, а просто добавил элементы в коллекцию, а Hibernate сделал все остальное.Всегда работал для меня, и я не помню, чтобы видел другой вариант в одной из моих книг Hibernate, но не могу проверить прямо сейчас.

0 голосов
/ 05 июня 2011

Я подозреваю, что вы забыли отобразить элемент в Item, но вы не отображаете сопоставление, поэтому я не могу подтвердить.

Также обратное означает, что Hibernate не будет обновлять информацию о связях с этой стороны.Не забудьте также настроить item.setCategory (category) для правильного запуска обновления базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...