0

次のマッピングを使用しようとしています:

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

3 に答える 3

1

双方向の関係がある場合にのみ、inverseをtrueに設定します。逆は、メモリに冗長な関係があるため、セットが保存されないことを意味します。

編集そしてもちろん、同じデータベースフィールドにマップする必要があります。

セットはに行きidます:

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

そして多対1はに行きCATEGORYます:

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

セットをに変更してCATEGORY、問題を修正します。

<set ...>
    <key column="CATEGORY" not-null="true"/>
    <one-to-many  class="Item"  />
</set>
于 2011-06-06T07:06:32.137 に答える
0

3 つのアイテムを含むカテゴリをデータベースに保存した後、すべてのアイテムが正しく書き込まれたかどうかを確認しましたか (別のツールに接続してアイテムを選択し、category_id 列を確認するなど)。

はいの場合: 生成された SQL ステートメントの Hibernate-Log を確認しましたか?

はいの場合: これらは大丈夫でしたか?

補足として:

public void setCategory(Category category) {
    this.category = category;
    category.getItems().add(this);
}

私はこれらをいたるところで見続けています。実際、私はこれを行ったことがなく、アイテムをコレクションに追加しただけで、残りは Hibernate に任せました。常に私のために働いていました.Hibernateの本の1つで他の亜種を見たのを思い出せませんが、今は確認できません.

于 2011-06-06T08:09:08.933 に答える
0

in Item をマッピングするのを忘れたのではないかと思いますが、マッピングが表示されていないので確認できません。

また、逆は、Hibernate がこちら側から関係情報を更新しないことを意味します。データベースの更新を適切にトリガーするために、 item.setCategory(category) の設定も行ってください。

于 2011-06-05T08:26:07.013 に答える