[英]One-to-one mapping where primary key is foreign key - what annotations are required
我有以下表格:
Table: MyEntity {
MyEntityId: primary-key, auto-generated
// other fields ommited
}
Table: MyEntityLastAction {
MyEntityId: primary-key
// other fields ommited
}
MyEntityLastAction.MyEntityId
有一个约束,它必须存在于MyEntity
。 (这是一个外键) MyEntityLastAction
是一个非常大的记录,因此为什么将其拆分为另一个表 我无法正确设置实体注释。 我大致在这里:
@Entity
public class MyEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public long myEntityId;
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
public MyEntityLastAction lastAction;
}
@Entity
public class MyEntityLastAction {
@Id
public long myEntityId;
@OneToOne(mappedBy = "MyEntity", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "MyEntityId")
public MyEntity myEntity;
}
我想尝试运行以下图像:
MyEntity myEntity = new MyEntity();
myEntity.lastAction = new MyEntityLastAction();
em.save(myEntity);
我认为您正在寻找@MapsId
注释。 这使您可以使用具有共享主键的@OneToOne
。
请参阅以下代码以供参考:
@Entity
class MyEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public long myEntityId;
@OneToOne(mappedBy = "myEntity", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
public MyEntityLastAction lastAction;
}
@Entity
class MyEntityLastAction {
@Id
public long myEntityId;
@OneToOne
@JoinColumn(name="MyEntityId")
@MapsId
public MyEntity myEntity;
}
并保存实体:
MyEntity me = new MyEntity();
me.lastAction = new MyEntityLastAction();
me.lastAction.myEntity = me;
entityManager.persist(me);
有两个问题:首先,您的mappedBy
属性应该是MyEntity
的字段名称(在本例中为lastAction
)。 其次,由于mappedBy
属性指示关系的另一端处理应如何将两个对象链接在一起,因此需要将联接列注释移到那里。 这应该工作:
@Entity
public class MyEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public long myEntityId;
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
@PrimaryKeyJoinColumn(name = "MyEntityId")
public MyEntityLastAction lastAction;
}
@Entity
public class MyEntityLastAction {
@Id
public long myEntityId;
@OneToOne(mappedBy = "lastAction", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
public MyEntity myEntity;
}
请注意,如果使用JPA创建新的MyEntity
,它将不会在其中级联新的MyEntityLastAction
。 你必须坚持先MyEntity
,然后在设定的ID MyEntityLastAction
到一个分配给MyEntity
,然后坚持MyEntityLastAction
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.