首页 > 解决方案 > Hibernate 尝试在没有任何级联的情况下插入一对一的关系

问题描述

问题

我有两个实体。一种称为EntityPojo,另一种称为ChunkPojo。entityPojo 不知道 ChunkPojo。ChunkPojo 对 EntityPojo 有 1:1 的引用。首先我保存 EntityPojo,然后我保存 ChunkPojo。

在我保存 ChunkPojo 时,休眠尝试插入引用的 1:1 EntityPojo,这会导致重复键异常。但是......级联被禁用,这不应该发生。

异常图片

编码


/** The base for all database objects
*/
@MappedSuperclass
public abstract class DatabaseObject extends Component{

    @Id
    public Long id;

    @MapsId
    @JoinColumn(name = "id")
    @OneToOne(cascade = {})
    public EntityPojo entityPojo;
}

@Entity
@Table(name = "entity")
@Access(AccessType.FIELD)
public class EntityPojo {

    @Id public long id;
    public long version;

    public String tag;
    public String typeID;

    public EntityPojo() { }
}

/**
 * A chunk which extends DatabaseObject.
 */
@Entity
@Table(name = "chunk", uniqueConstraints = {@UniqueConstraint(columnNames={"x", "y"})}, indexes = {@Index(columnList = "x,y")})
@Access(value = AccessType.FIELD)
@SelectBeforeUpdate(value = false)
public class ChunkPojo extends DatabaseObject {

    public int x;
    public int y;
    public Date createdOn;
}

public static void main(String[] args){

        var enitity = new EntityPojo();
        enitity.id = 1;
        enitity.tag = "player";
        enitity.typeID = "1:1";

        var chunk = new ChunkPojo();
        chunk.x = 10;
        chunk.y = 11;
        chunk.entityPojo = enitity;
        chunk.id = enitity.id;

        syncDatabase.save(enitity);  // Just calls session.persist - works fine 
        syncDatabase.save(chunk);    // Also calls session.persist - exception
}

问题

当我显然没有在这里使用任何级联时,为什么休眠尝试插入引用的 1:1 关系?我怎样才能防止它发生?

很高兴在这个主题上有任何帮助!它让我疯狂 !谢谢 !

标签: javamysqlsqlhibernate

解决方案


认为发生的事情是@MapsId注释告诉 Hibernate 获取 IDchunk并将其映射到entity. 因此,当您保存chunk它时,它会自动保持级联,即使您没有明确告诉它这样做。


推荐阅读