Java 如何使用循环引用休眠注释
我有两张圆形参考的桌子Java 如何使用循环引用休眠注释,java,hibernate,hibernate-annotations,Java,Hibernate,Hibernate Annotations,我有两张圆形参考的桌子 -----------------| |------------------ product | | product_detail -----------------| |------------------ product_id <pk> | | detail_id <pk> ..
-----------------| |------------------
product | | product_detail
-----------------| |------------------
product_id <pk> | | detail_id <pk>
... | <-----------------| container_id <fk>
| <-----------------| product_id <fk>
| | ...
我想使用以下代码:
Product p1 = new Product(name2);
Product p2 = new Product(name1);
Detail d = new Detail();
d.setProduct(p2);
p1.getDetails().add(d);
...
Session.save(p1);
然后休眠插入产品
和插入细节
我没有找到创建注释的方法来让它工作。您能帮助我吗?在您的情况下,您的代码应该如下所示:
Class Product
@OneToMany(mappedBy = "product")
public List<Detail> getDetails();
这背后的原因是,在@OneToMany中,您在mappedBy参数中注意到Detail类中的哪个字段引用了该产品。只要遵守标准命名约定,@ManyToOne注释中不需要任何额外信息。我尝试了使用mappedBy发布的解决方案,但在运行示例代码时,db上只插入了产品 我发现它工作正常的唯一方法是使用OneToMany side owner的注释:
Class Detail
@ManyToOne(cascade={CascadeType.ALL})
@JoinColumn(name="container_id")
public Product getContainer() {
@ManyToOne
@JoinColumn(name="product_id")
public Product getProduct() {
Class Product
@OneToMany(cascade={CascadeType.ALL})
@JoinColumn(name="container_id")
public Set<Detail> getDetails()
在这种情况下,插入两个产品,并插入详细信息
但有一点不方便,因为如果我不想收到:
SQLIntegrityConstraintViolationException: Column 'container_id' cannot be null
我必须更改de table detail并将外键“container_id”设置为NULL,这与模型不符
CHANGE COLUMN `container_id` `container_id` INT(11) NULL
其中细节必须始终具有容器产品
有人能解释一下这个问题吗?mappedBy(on
@OneToMany
)使它成为一种双向关系。这就是所有需要的是的,这是我在发帖前尝试的方式,但后来我得到一个超时错误@getDetails()列表的OneToMany(mappedBy=“container”)和getContainer()的@ManyToOne@JoinColumn(name=“container\u id”)以及此解决方案详细信息对象未插入数据库中,只有productsHi axiorema,请查看并查看一对多部分。将cascade=CascadeType.PERSIST添加到@OneToMany注释时,应注意将子项与父项一起持久化。
Class Detail
@ManyToOne(cascade={CascadeType.ALL})
@JoinColumn(name="container_id")
public Product getContainer() {
@ManyToOne
@JoinColumn(name="product_id")
public Product getProduct() {
Class Product
@OneToMany(cascade={CascadeType.ALL})
@JoinColumn(name="container_id")
public Set<Detail> getDetails()
Product p1 = new Product("the container");
Product p2 = new Product("the product");
Detail d = new Detail();
d.setProduct(p2);
p1.getDetails().add(d);
session.save(p2);
session.save(p1);
SQLIntegrityConstraintViolationException: Column 'container_id' cannot be null
CHANGE COLUMN `container_id` `container_id` INT(11) NULL