Java Hibernate中的三元(和n元)关系

Java Hibernate中的三元(和n元)关系,java,hibernate,database-design,orm,jpa,Java,Hibernate,Database Design,Orm,Jpa,问题1)我们如何使用Hibernate建模三元关系?例如,我们如何对使用Hibernate(或JPA)呈现的三元关系建模 注意:我知道JPA2添加了一些构造,用于使用映射构建三元关系。然而,这个问题假设JPA1或Hibernate3.3.x,我不喜欢使用映射来建模 (来源:) (来源:) 理想情况下,我希望我的模型是这样的: class SaleAssistant { Long id; //... } class Customer { Long id; //... } class Pr

问题1)我们如何使用Hibernate建模三元关系?例如,我们如何对使用Hibernate(或JPA)呈现的三元关系建模

注意:我知道JPA2添加了一些构造,用于使用映射构建三元关系。然而,这个问题假设JPA1或Hibernate3.3.x,我不喜欢使用映射来建模


(来源:)



(来源:)

理想情况下,我希望我的模型是这样的:

class SaleAssistant {
Long id;
//...
}

class Customer {
Long id;
//...
}

class Product {
Long id;
//...
}

class Sale {
SalesAssistant soldBy;
Customer buyer;
Product product;
//...
}
Sale sale = new Sale();
Pk pk = new Pk(saleAssistant.getId(), customer.getId(), product.getId());
sale.setPk(pk);
sale.setSoldBy(saleAssistant);
sale.setBuyer(customer);
sale.setProduct(product);
...
问题1.1)

我们如何建模这种变化,其中每个销售项目可能有许多产品

class SaleAssistant {
Long id;
//...
}

class Customer {
Long id;
//...
}

class Product {
Long id;
//...
}

class Sale {
SalesAssistant soldBy;
Customer buyer;
Set<Product> products;
//...
}
class助手{
长id;
//...
}
类客户{
长id;
//...
}
类产品{
长id;
//...
}
大减价{
销售助理索尔德比;
客户买方;
成套产品;
//...
}
问题2)一般来说,我们如何用Hibernate建模n元、n>=3关系

提前谢谢

问题1。如何使用Hibernate对三元关系建模?例如,我们如何使用Hibernate(或JPA)对这里介绍的三元关系建模?(……)

我将用一个中间实体类(这是Hibernate的推荐方法)重新建模关联。适用于您的示例:

@Entity
public class Sale {
    @Embeddable
    public static class Pk implements Serializable {
        @Column(nullable = false, updatable = false)
        private Long soldById;

        @Column(nullable = false, updatable = false)
        private Long buyerId;

        @Column(nullable = false, updatable = false)
        private Long productId;

        public Pk() {}

        public Pk(Long soldById, Long buyerId, Long productId) { ... }

        // getters, setters, equals, hashCode
    }

    @EmbeddedId
    private Pk pk;

    @ManyToOne
    @JoinColumn(name = "SOLDBYID", insertable = false, updatable = false)
    private SaleAssistant soldBy;
    @ManyToOne
    @JoinColumn(name = "BUYERID", insertable = false, updatable = false)
    private Customer buyer;
    @ManyToOne
    @JoinColumn(name = "PRODUCTID", insertable = false, updatable = false)
    private Product product;

    // getters, setters, equals, hashCode
}
问题1.1。我们如何建模这种变化,其中每个销售项目可能有许多产品

class SaleAssistant {
Long id;
//...
}

class Customer {
Long id;
//...
}

class Product {
Long id;
//...
}

class Sale {
SalesAssistant soldBy;
Customer buyer;
Set<Product> products;
//...
}
我不会在这里使用复合主键并为
Sale
实体引入PK

问题2。通常,我们如何用Hibernate建模n元、n>=3关系

我认为我对Q1的回答是正确的。包括这个。如果没有,请澄清


更新:回答OP的评论

(…)主键字段未填充,因此我无法在数据库中保存销售项目。我应该在Sale类中使用这样的setter吗?public void setBuyer(Customer-cust){this.buyer=cust;this.pk.buyerId=cust.getId();}

您需要创建一个新的
Pk
(为了简洁起见,我从原始答案中删除了构造器),并将其设置在
Sale
项上。我会这样做:

class SaleAssistant {
Long id;
//...
}

class Customer {
Long id;
//...
}

class Product {
Long id;
//...
}

class Sale {
SalesAssistant soldBy;
Customer buyer;
Product product;
//...
}
Sale sale = new Sale();
Pk pk = new Pk(saleAssistant.getId(), customer.getId(), product.getId());
sale.setPk(pk);
sale.setSoldBy(saleAssistant);
sale.setBuyer(customer);
sale.setProduct(product);
...
然后继续执行
销售

此外,在JoinColumn注释中,“名称”字段指的是哪一列?目标关系的pks还是销售表自己的列名


对于复合
Pk
属性的列(即销售表自己的列名),我们希望它们获得Pk和FK约束。

您是否使用数据库为客户、产品和SalesAssistant生成的主键?这可能会导致一个问题,因为看起来您试图使用实际的DB标识,而不是让Hibernate在实际持久化期间解析对象引用

上面的嵌入式PK对我个人来说很奇怪,但我还没有机会尝试。这两个柱子好像重叠在一起,互相撞击

我认为只要有很多个人的证明就足够了


另外,打开SQL语句调试,查看发送到DB的内容。

谢谢您的回复。但是当我使用它时遇到了一个问题:pk的字段没有填充,因此我无法在DB中保存销售项目。我应该在Sale类中使用这样的setter吗?public void setBuyer(Customer-cust){this.buyer=cust;this.pk.buyerId=cust.getId();}另外,在JoinColumn注释中,“name”字段指的是哪一列?目标关系的pks还是销售表自己的列名?