Java 在持久化新实体后,如何使用其父实体的信息填充实体中的字段
我拥有以下实体:Java 在持久化新实体后,如何使用其父实体的信息填充实体中的字段,java,hibernate,jpa,Java,Hibernate,Jpa,我拥有以下实体: @Entity() public class Parent { @Id private Long id; private String name; ... } 子实体必须始终具有父实体 我希望子类将父对象id作为字段,并将父对象中的所有字段作为父对象 通过这种方式,我可以保存一个子实体,该实体只有父的id,理想情况下,当从数据库检索子时,将填充子中的父对象 我已经了解到,当从数据库检索子对象时,父字段将填充父对象实体,但如果我仅使用父对
@Entity()
public class Parent {
@Id
private Long id;
private String name;
...
}
子实体必须始终具有父实体
我希望子类
将父对象id作为字段,并将父对象中的所有字段作为父对象
通过这种方式,我可以保存一个子
实体,该实体只有父
的id,理想情况下,当从数据库检索子
时,将填充子
中的父对象
我已经了解到,当从数据库检索子对象时,父字段将填充父对象
实体,但如果我仅使用父对象id持久化新的子对象
实体,则不会自动填充父对象
有什么办法可以做到这一点吗?看起来应该有帮助
如果希望在子实体
和父实体
之间提供正确的引用,并推迟父实体
的实际加载。你应该这样做:
Child newChild=newChild();
setParent(entityManager.getReference(Parent.class,Parent_id));
// ...
entityManager.persist(newChild);
或者,如果您想让newChild
具有完全初始化的Parent
而不是entityManager.getReference
,您应该使用entityManager.find(Parent.class,Parent\u id)
另外,@JBNizet在评论中给出了相同的建议。删除父id字段(以及可插入和可更新的属性)。当您只有一个parentId并且需要相应的父对象时,请使用EntityManager.find()或EntityManager.getReference()获取它。@RabidOrange在下,父对象不会自动填充是什么意思?如果要在持久化新的子项时持久化父项
,则应将cascade=CascadeType添加到@ManyToOne
@SternK,假设我在数据库中有一个父项,如父项id=1,name=“papa”
。然后我创建一个子对象,比如Child id=null,parent\u id=1,parent=null,name=“boy”
。当我运行childRepository.save(child)
时,save方法生成的输出子对象如下:child id=1,parent\u id=1,parent=null,name=“boy”
我想知道是否可以检索child id=1,parent\u id=1,parent=parent(id=1,name=“papa”),name=“boy”
instead@JBNizet我无法删除parent_id字段,因为我有一些方法可以通过parent id按子实体查找。然后,ChildRepository会抛出一个异常,因为例如像.findAllByParentId(long)这样的方法无法处理
,因为没有父id
字段。然后修复该存储库方法,使其使用正确的查询。你可以做到。这是正确的规范映射。
@Entity()
public class Child {
@Id
private Long id;
private String name;
@Column(name = "parent_id")
private long parent_id;
@ManyToOne(targetEntity = Parent.class)
@JoinColumn(name = "parent_id", insertable = false, updatable = false)
private Parent parent;
...
}