java - 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 关系?我怎样才能防止它发生?
很高兴在这个主题上有任何帮助!它让我疯狂 !谢谢 !
解决方案
我认为发生的事情是@MapsId
注释告诉 Hibernate 获取 IDchunk
并将其映射到entity
. 因此,当您保存chunk
它时,它会自动保持级联,即使您没有明确告诉它这样做。
推荐阅读
- javascript - 如何从用户那里获取值并在 Javascript 中使用它
- hadoop - 切换名称节点 - Hadoop Java api with camel , jms
- python - 无法从 google.cloud 导入存储
- python - 如何在使用 Pandas 处理 .csv 文件时合并大写和小写?
- regex - 用 sed 解析
- php - 如何在 laravel 的隐藏字段中添加 required
- c# - GetBaseException() 适用于本地主机,但发布后为空
- javascript - Vuex 和 Event Bus 有什么区别?
- php - Laravel 5.7 - 广播 - socket.io - redis:客户端没有任何反应
- go - 为什么在golang中只初始化定义中的一个变量会失败