保存实体后休眠一对一和多对一关系的奇怪行为

时间:2018-07-03 05:50:31

标签: java hibernate spring-boot spring-data-jpa spring-data

我将Spring Boot与Spring Data结合使用,并且为了保存实体,我使用CrudRepository。我有2个实体:Org和OrgDef。这个想法是为一个组织存储多个定义。 Org是不可变的部分,而OrgDef是可变的。这就是它在代码中的样子:

@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Entity
@Table(name = "org", uniqueConstraints = {
    @UniqueConstraint(columnNames = { "code" }, name = "uk_org_code"),
    @UniqueConstraint(columnNames = { "definition_id"}, 
    name = "uk_org_definitionId")})
public class Org {

@Id
@Column(
    name = "id",
    updatable = false,
    nullable = false
)
protected UUID id = UUID.randomUUID();

@Column(updatable = false)
protected String code;

@JoinColumn(nullable = false, foreignKey = @ForeignKey(name = "fk_org_definition_orgDef"))
@OneToOne(optional = false, cascade = { CascadeType.PERSIST, CascadeType.MERGE })
protected OrgDef definition;

}



@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Setter
@Entity
@Table(name = "org_def")
public class OrgDef extends UuidIdEntity {

@Id
@Column(
    name = "id",
    updatable = false,
    nullable = false
)
protected UUID id = UUID.randomUUID();    

@JoinColumn(foreignKey = @ForeignKey(name = "fk_orgDef_orgId_org"), updatable = false)
@ManyToOne
protected Org org;

@JoinColumn(foreignKey = @ForeignKey(name = "fk_orgDef_parentId_org"))
@ManyToOne
protected Org parent;
}

我还要指出,Org与OrgDef具有一对一的关系,而OrgDef与Org具有多对一的关系。另外,OrgDef具有“父”字段,该字段也具有“多对一”关系。当我保存此类的记录时,我将其保存在表中:

组织表:

enter image description here

OrgDef 表: enter image description here

您可以看到表 OrgDef 中的字段 org_id 为空,但 parent_id 不为空。但是在保存时,我为 OrgDef 对象中的 org parent 字段都指定了 Org 对象。可能是映射问题?有人可以帮忙吗?因为 OrgDef parent 字段保存得很好,但是 OrgDef org 字段却不保存!我的期望是 org_id parent_id 都不为空

1 个答案:

答案 0 :(得分:0)

我发现了问题,我在OrgDef类的org字段上使用了此批注:

@JoinColumn(foreignKey = @ForeignKey(name = "fk_orgDef_orgId_org"), updatable = false)

我指定此字段不可更新,因此休眠状态无法向该字段插入值。我从此注释中删除了updatable = false,现在一切正常!