我有一个课程如下
class A{
Set<B> = new HashSet<B>();
}
class B{
A a;
}
现在A的主键是自动生成的,所以我不能在A或B.B之前设置它。反向映射A.And B中的对象最初是null。
这映射到DB中的2个表A和B.如果我有一个对象A,其Set包含2个记录,那么当我保存对象A然后在B.中创建2个记录。现在我的代码工作正常。但是当我看到recods时在B中我发现对应A的外键是空白的。怎么来的?
TABLE B structure
BId Aid Bname
// Aid是A tablles主键的外键,Aid存储为null,为什么会这样?我希望Aid应该自动存储在B中
答案 0 :(得分:4)
您需要正确设置关系的两侧
parentA.getBChilds().add(childB);
childB.setParentA(parentA); <-- Important see link below working bi
您可以在父级中创建链接管理方法,以正确设置双方。
public class ParentA
{
...
public void addChildB(B pChild)
{
this.childsB.add(pChild);
pChild.setParentA( this );
}
...
}
在集合关系
上将'inverse'属性设置为true<set name="bChilds" inverse="true">
<key column="bID"/>
<one-to-many class="childB"/>
</set>
也许你在反向和级联之间混合。有关一个很好的解释,你可以阅读hibernate inverse属性Hibernates bizarre interpretation of inverse ;)上的这篇博客文章以及Working bi-directional links上的这个hibernate doc