我将简要说明情况。我有2个实体,一个是所有者,并且具有FK,而另一个是加入的实体。情况是,所有者只能有一个孩子,而该孩子可以有多个所有者。但是,我认为我需要的是单向的OneToOne,因为我希望能够在所有者端执行所有CRUD操作,但是由于我正在执行的操作,我不希望任何子级被更新或删除。给所有者。如果这种推理是错误的,请纠正我。这就是我所拥有的:
@Entity
public class Parent {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", updatable = false, nullable = false)
private Long id;
@Column
private fk_id;
// various fields with their getter and setters
@OneToOne
@JoinColumn(name = "fk_id", referencedColumnName = "id", insertable = false, updatable = false)
private Child childEntity;
}
@Entity
public class Child{
@Id
@Column(name = "id", updatable = false, nullable = false)
private Long id;
}
我遇到的问题如下:-尝试使用有效的fk_id插入新的Parents调用save()错误之前,必须手动分配此类的ID我尝试解决此问题,但很快意识到这实际上不是问题。我遇到了这个问题,因为在创建新的父级JPA时,实际上是在尝试创建链接到该父级的子级,而它不能这样做,因为我没有ID的生成策略(这就是我想要的)。
经过各种尝试后,我觉得这是问题所在,我无法添加链接到现有子项的新父项,因为我尝试添加的每个父级JPA都会尝试添加相应的新子项。
我以为我可以通过单向的OneToOne关系来解决此问题,但是我做错了还是其他的事情做错了,因为单向的OneToOne需要我不需要的级联类型。
(父亲->孩子)关系是ManyToOne
我不太清楚这个问题,如果子实体已经存在,您将必须获取BBDD的完整对象,以便它不是临时实体并将其建立为父属性。
此外,删除可插入的false和可更新的false,这是隐式的:
@JoinColumn (name = "fk_id", referencedColumnName = "id", insertable = false, updatable = false)
如果您想将其设置为true,则必须设置关系的类型,删除,更新的类型等等
@ManyToOne (cascade = {CascadeType.MERGE, CascadeType.PERSIST})
您可以在其中保留新父亲的那段代码吗?