Java Hibernate中的三元(和n元)关系
问题1)我们如何使用Hibernate建模三元关系?例如,我们如何对使用Hibernate(或JPA)呈现的三元关系建模 注意:我知道JPA2添加了一些构造,用于使用映射构建三元关系。然而,这个问题假设JPA1或Hibernate3.3.x,我不喜欢使用映射来建模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
(来源:)
(来源:) 理想情况下,我希望我的模型是这样的:
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还是销售表自己的列名?