Hibernate 冬眠逆='';“真的”;以及一对多的问题

Hibernate 冬眠逆='';“真的”;以及一对多的问题,hibernate,lazy-loading,hibernate-onetomany,Hibernate,Lazy Loading,Hibernate Onetomany,我正在尝试使用以下映射: <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=

我正在尝试使用以下映射:

<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>

我怀疑您忘记映射in项,但您没有显示映射,因此我无法确认


同样,反向意味着Hibernate不会从这边更新关系信息。确保还设置了item.setCategory(category)以正确触发数据库更新。

只有在存在双向关系时才将inverse设置为true。反向表示由于内存中存在冗余关系,所以不存储集合

编辑当然,它必须映射到同一数据库字段中:

该设置转到
id

<set name="items" ...>
    <key column="id" not-null="true"/>
    <one-to-many  class="Item"  />
</set>
将设置更改为
类别
,并修复问题:

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

将包含3个项目的类别保存到数据库后,是否检查了所有项目的写入是否正确(如与其他工具连接并选择了项目,检查类别id列)

如果是:是否检查了Hibernate日志中生成的SQL语句

如果是:这些可以吗

作为旁注:

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

我到处都能看到这些。事实上,我从来没有这样做过,只是简单地将项目添加到集合中,然后Hibernate完成了其余的工作。一直对我有效,我不记得在我的一本Hibernate书籍中看到过另一个变体,但现在无法检查。

还有其他问题。给我们看看代码。你好,艾曼纽!我已经发布了上面的代码,实际上项目已经映射。关联是双向的。。我不明白你说的ISet是什么意思?它是Java的,在内存中应该是双向的。您需要在内存中正确设置关系。如果你找不到问题,写一个小测试来重现它并发布代码。你是对的,Set已经是一个接口了。我从回答中删除了它。@Test public void lazyInitTest(){Category cat=new Category();cat.setName(“带_项的CTAEGORY_”);Item Item=new Item();Item.setName(“ITEM1”);Item Item item2=new Item();Item Item item3.setName(“Test”);cat.addItem(Item);cat.addItem(Item)(Item 2)Category Category=categoryDao.getCategory(cat.getId());System.out.println(cat.getId()+“--”+Category.getId());Assert.assertEquals(cat.getItems().size(),Category.getItems().size();)注释不是编写代码的好地方。我在这里试图说明的是,测试的行为是相同的——检索的类别只包含一项,因此las断言失败。用于检索类别的代码如下所示:公共类别getCategoryById(长id){Session Session=getSession();Transaction Transaction=Session.beginTransaction();Transaction.begin();category result=(category)Session.get(category.class,id);Transaction.commit();Session.close();return result;}是。我已经检查了数据库中的记录,项目被正确地持久化,因此分散数据可以工作,但对象没有正确加载。您能否更改日志配置,以显示hibernate用于加载对象(最好包括绑定变量)和发布结果的sql语句?
<many-to-one ... column="CATEGORY">
</many-to-one>
<set ...>
    <key column="CATEGORY" not-null="true"/>
    <one-to-many  class="Item"  />
</set>
public void setCategory(Category category) {
    this.category = category;
    category.getItems().add(this);
}