代码之家  ›  专栏  ›  技术社区  ›  Abzelhan

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

  •  1
  • Abzelhan  · 技术社区  · 6 年前

    我对spring数据使用spring boot,对于保存实体,我使用crudrepository。我有两个实体: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也有“parent”字段,它也有多对一关系。当我保存这个类的记录时,我的表中有这个:

    组织 表格:

    enter image description here

    组织定义 表格: enter image description here

    你可以在桌子上看到 组织定义 领域 组织ID 是空的,但是 父ID 不为空。但是在保存时我指定 组织 两者的对象 组织 起源 字段 组织定义 反对。可能是映射中的问题?有人能帮忙吗?因为 起源 领域 组织定义 很好,但是 组织 字段输入 组织定义 不是存钱!我的期望是 组织ID 父ID 将不为空

    1 回复  |  直到 6 年前
        1
  •  0
  •   Abzelhan    6 年前

    我发现了问题,我在orgdef类的org字段上使用了这个注释:

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

    我指定此字段不可更新,因此Hibernate无法向此字段插入值。我删除了 updatable = false 从这个注释,现在一切正常!