实体中未设置JPA hibernate外键
我正在使用CASCADE.PERSIST执行父子保存实体中未设置JPA hibernate外键,hibernate,jpa,Hibernate,Jpa,我正在使用CASCADE.PERSIST执行父子保存 @Entity @Table(name = "parent") public class Parent extends AbstractAuditingEntity{ @OneToMany(fetch = FetchType.LAZY,cascade = CascadeType.PERSIST) @JoinColumn(name = "parent_id",nullable = false) private List
@Entity
@Table(name = "parent")
public class Parent extends AbstractAuditingEntity{
@OneToMany(fetch = FetchType.LAZY,cascade = CascadeType.PERSIST)
@JoinColumn(name = "parent_id",nullable = false)
private List<Child> children;
}
@Entity
@Table(name = "child")
public class Child extends AbstractAuditingEntity{
@Column(name = "parent_id", insertable=false, updatable=false)
private Long parentId;
}
但是从存储库返回的实体在子项中没有设置外键
child.getParentId()为空
有什么我可以做的吗
已尝试在子级中设置父级,但存在相同的问题
@Entity
@Table(name = "child")
public class Child extends AbstractAuditingEntity{
@ManyToOne
@JoinColumn(name="parent_id",nullable = false,insertable=false,updatable=false)
private Queue queue;
}
虽然这不是一个关键问题(我可以从父级手动设置),但我只是想确定我是否做对了。保存时没有神奇的事情发生。这意味着如果不设置parentId,则此字段为空。你必须自己设定
当您使用find或与查询一起读取数据时,该字段将由JPA设置。正如JB Nizet所指出的,双向映射不正确 这已被更正,根据下面的链接,它工作良好
1。我们需要一个完整的最小示例来了解您正在做什么(事务边界等)。2.首先,你不应该在Child中有prentId字段。删除它,或者用Parent类型的字段替换它,并按照手册中的说明将该关联设置为适当的双向OneToMany关联。感谢您的澄清。双向关联也有相同的问题。更新了问题,该问题不是双向关联的映射方式。您还没有发布一个完整的最小示例,所以我只能猜测,在同一个事务中,您希望Hibernate填充多方。不会的。按规定。谢谢你提供的信息。是的,这发生在同一个事务中。我将尝试纠正双向关联问题已根据JB Nizet给出的建议解决。但这通常不是最佳解决方案,因为这可能导致n+1问题。正确。对于这项服务,n+1问题的成本不是一个问题。可能是为了将来的服务,我计划处理n+1问题。顺便说一句。您的问题的解决方案是我的答案,因为在创建对象时,您必须始终注意填充所有字段。JPA没有魔力
@Entity
@Table(name = "child")
public class Child extends AbstractAuditingEntity{
@ManyToOne
@JoinColumn(name="parent_id",nullable = false,insertable=false,updatable=false)
private Queue queue;
}