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