Java JPA@OneToMany与1-1..*关系

Java JPA@OneToMany与1-1..*关系,java,hibernate,jpa,orm,one-to-many,Java,Hibernate,Jpa,Orm,One To Many,如何正确映射@OneToMany关系在何处创建实体,在@OneToMany关系的@One侧,要求从@Many侧至少有一个实体,但@Many侧的实体也要求存在@One侧的实体?简单地说,这是一个句子的噩梦,这是我的情景: 这就是我想要的: [实体A]1(1..*)[实体B] 目前,我有以下几点: [实体A]1(0..*)[实体B] 这样做很容易 @OneToMany(cascade=CascadeType.ALL, mappedBy="customer") public Set

如何正确映射
@OneToMany
关系在何处创建实体,在
@OneToMany
关系的
@One
侧,要求从
@Many
侧至少有一个实体,但
@Many
侧的实体也要求存在
@One
侧的实体?简单地说,这是一个句子的噩梦,这是我的情景:

这就是我想要的:

[实体A]1(1..*)[实体B]
目前,我有以下几点:

[实体A]1(0..*)[实体B]
这样做很容易

@OneToMany(cascade=CascadeType.ALL, mappedBy="customer")
public Set<Agreement> agreements = new HashSet<>();

所以问题是我的
CUSTOMER
表没有与
AGREEMENT
表对应的列,因此我无法仅在给定
AGREEMENT
时执行创建
CUSTOMER
的规则。目前,我只能设置规则,在给定
Customer
时创建
Agreement
,因为
Agreement
表中有一列对应于
Customer
选项卡,这很容易通过
nullable=false
条件来实现。

这在很大程度上取决于您想要实施的关系类型。如果协议可以独立于客户而存在,则这意味着协议中的客户id必须为空

如果协议无法独立存在,则假定客户id不可为空,在这种情况下,如果不创建客户,则无法首先创建协议。这意味着客户和相应协议之间的关联性更强

一旦我们确定我们的关系是牢固的,我们需要调查它到底有多牢固,谁将拥有谁。通常情况下,是多方拥有关系,而更新是通过多方进行的。这意味着您的JoinColumn需要位于多个列上,而mapped by需要位于一侧


有趣的是,当一方实际拥有关系时,所有权是反向的,在这种情况下,多方上的外键不能为NULL,因为拥有方无法知道多方键是什么。

JPA没有提供验证方法,但Hibernate Validator可以:

@NotNull
@Size(min=1)
public Set<Agreement> agreements = new HashSet<>();

我可能会误解这里的某些内容,但如果没有外键,就无法映射关系。您的联接列是如何成为客户的主键的?这完全没有意义。谢谢,这是一种很好的编程方式来防止这种情况发生,当我想通过我的应用程序提供的服务向数据库中添加一些内容时,这种方式很有效,但不幸的是,我仍然可以在h2控制台中通过SQL创建客户。我正试图找到解决方案,使我的DB验证客户的插入。在H2或纯SQL中验证不是那么容易,我相信它可能有点“黑客”,所以不那么干净。我想建立一种关系,在这种关系中,客户没有协议就不能存在,协议没有客户也不能存在。目前,由于需要外键,协议无法在没有客户的情况下存在,但由于客户中缺少任何外键,因此可以在没有协议的情况下创建客户。我想的解决方案,我不知道它是否正确或可能,具有@OneToMany关系,其中客户的主键是客户ID和协议外键的组合键,协议的主键只是协议ID,协议要求外键不为null。@askstackoverflow您不能以非编程方式实现此目的。只有一方拥有关系并控制对另一方的更新。实现这一点的唯一方法是在hibernate端使用programmaticaly,正如另一个答案所示,或者在数据库端实现一些在事务完成之前触发的东西。好的,谢谢,那么我将继续使用编程方式。@askstackoverflow。我也不认为NotNull是正确的方法。如果你没有协议就不能拥有客户,你需要做的是不能在第一位插入Agreemnt,你应该让你的关系拥有方成为客户。正确的做法是从客户到协议的单向一对多,这样可以创建一个强大的关联。由于单向关联的性质,它将创建一些额外的更新SQL,但是毫无疑问,这种关联有多强。
@NotNull
@Size(min=1)
public Set<Agreement> agreements = new HashSet<>();
ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
Validator validator = validatorFactory.getValidator();
validator.validate(customer)