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;

    ...

}