【发布时间】:2014-08-27 00:03:37
【问题描述】:
我被侵犯了 - 尝试保存 Hibernate 实体时找不到父键
我有父实体:
@Entity
@Table(name = "parents")
public class Parent implements Serializable {
private static final long serialVersionUID = 1246376778314918671L;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq")
@SequenceGenerator(name = "seq", sequenceName = "PARENT_ID_SEQ", allocationSize = 1)
@Column(name = "parent_id")
private long parentId;
@Column(name = "display_name")
@Size(min = 1, max = 128)
@NotBlank
private String displayName;
@JsonManagedReference("childAssignments")
@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval=true)
private Set<ChildAssignment> childAssignments = new HashSet<ChildAssignment>(0);
//regular getters and setters here
}
子实体看起来像(在数据库中,它在父表的 parent_id 字段上有外键):
Entity
@Table(name = "child_assignments")
public class ChildAssignment implements Serializable {
private static final long serialVersionUID = -5949955576511639261L;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq")
@SequenceGenerator(name = "seq", sequenceName = "CHILD_ASSIGNMENT_ID_SEQ", allocationSize = 1)
@Column(name = "child_assignment_id")
private long childAssignmentId;
@Column(name = "parent_id")
private long parentId; // getting error because after creating new parent it has not been set
@Column(name = "site_id")
private long siteId;
@ManyToOne
@JoinColumn(name = "parent_id", insertable = false, updatable = false)
private Parent parent;
// regular getters and setters here
}
在创建父对象和 childAssignments 对象后,我将 childAssignment 添加到父对象
ChildAssignment ca = new ChildAssignment();
ca.setSiteId(1);
// I do not set parent_id here since I do not know it and expecting Hibernate to figure it out
parent.getChildAssignments().add(childAssignment);
session.save(parent);
预期结果是使用 ID 保存新的父条目,并在使用此 id 保存子项后,但似乎休眠在保存时不知道 parent_id,我应该如何建立我的关联以使其工作?还是 parent_id 字段上的一些注释?
更新
我尝试在 childAssignment 实体上删除 parent_id 或将其设置为 @Transient,并得到新错误 cannot insert NULL into table,很明显 Hibernate 正在尝试插入 parent_id 但不填充它,
对孩子设置父母也无济于事
ChildAssignment ca = new ChildAssignment();
ca.setSiteId(1);
ca.setParent(parent)
parent.getChildAssignments().add(childAssignment);
session.save(parent);
我错过了什么?
已解决
我解决了更改 childAssignment 实体的问题
@Transient -- add transient (just to have it)
@Column(name = parent_id", insertable = false, updatable = false) -- add insertable and updatable both equals to false
private parentId;
.....
@ManyToOne
@JoinColumn(name = "parent_id") -- remove insertable = false, updatable = false options
private Parent parent;
【问题讨论】:
-
我的子实体类会是什么样子?
-
我认为我在提供的示例中没有正确的解决方案,我不应该更改任何数据库设置来完成它。