Java 使用单表列映射双向OneTONE
我有两个实体:Java 使用单表列映射双向OneTONE,java,hibernate,persistence,one-to-one,Java,Hibernate,Persistence,One To One,我有两个实体: @Entity public class Device extends AbstractEntity { @OneToOne(mappedBy = "item") @PrimaryKeyJoinColumn private ItemOverview itemOverview; } 以及实体项目概述: @Entity public class ItemOverview extends AbstractEntity { @OneToOne(cas
@Entity
public class Device extends AbstractEntity {
@OneToOne(mappedBy = "item")
@PrimaryKeyJoinColumn
private ItemOverview itemOverview;
}
以及实体项目概述:
@Entity
public class ItemOverview extends AbstractEntity {
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "item_id")
private Item item;
}
它们都是从AbstractEntity
扩展而来,该实体具有以下特性:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
protected Long id;
在数据库中,两个表之间存在的唯一引用是ItemOverview
,其中有一列item\u id
。查看数据库时,表Item
不知道ItemOverview
因此,当我尝试保存包含Item(已经存在!)的新ItemOverview对象时,ItemOverview对象成功保存。但当我再次尝试这样做时,有效地更新了ItemOverview对象(而不更改Item),它会尝试插入Item对象,而不是更新它(或者一起跳过它)。为什么会发生这种情况?您能显示与hibernate会话和更新实体相关的代码吗?这里没有什么特别的事情发生。我只是使用JpaRepository获取并保存实体。Hibernate实体看起来很好,当更新实体时,您首先从数据库获取它,使用新值更新它,然后在Hibernate会话中更新它,不是吗?或者这应该是你的流程。@Darshit你实际上是对的。。我在更新代码的某个地方搞砸了,试图保存一个复制的(不是由Hibernate获取的)实例。难怪它会更新。谢谢你给我指明了正确的方向!如果你将此作为答案发布,我可以接受。这就是为什么它插入新记录而不是更新当前记录,因为该对象未连接hibernate会话。很高兴我能帮助你们:)你们能展示和hibernate会话和更新实体相关的代码吗?这里并没有什么特别的事情发生。我只是使用JpaRepository获取并保存实体。Hibernate实体看起来很好,当更新实体时,您首先从数据库获取它,使用新值更新它,然后在Hibernate会话中更新它,不是吗?或者这应该是你的流程。@Darshit你实际上是对的。。我在更新代码的某个地方搞砸了,试图保存一个复制的(不是由Hibernate获取的)实例。难怪它会更新。谢谢你给我指明了正确的方向!如果你将此作为答案发布,我可以接受。这就是为什么它插入新记录而不是更新当前记录,因为该对象未连接hibernate会话。很高兴我能帮助你:)