为了账号安全,请及时绑定邮箱和手机立即绑定

共享主键,但要单独管理/保存实体?

共享主键,但要单独管理/保存实体?

哆啦的时光机 2021-04-09 18:15:03
注意:我是一个休眠的新手。我目前正在尝试在春季对具有相同主键和OneToOne关系的2个实体进行建模。表格1 :CREATE TABLE person (id uuid NOT NULL,name varchar(10000),CONSTRAINT pk_person_id PRIMARY KEY (id))表2:CREATE TABLE nickname (id uuid NOT NULL,nick varchar(10000),CONSTRAINT pk_nickname_id PRIMARY KEY (id),CONSTRAINT fk_person_id FOREIGN KEY (id) REFERENCES person(id) ON DELETE CASCADE)Java类:@Getter@Setter@NoArgsConstructor@Entity@ToString@Table(name = "Person")public class Person {  @Id  private UUID id;  @Column(name = "name")  private String name;}@Getter@Setter@NoArgsConstructor@Entity@ToString@Table(name = "person")public class NickName {  @Id  private UUID id;  @Column(name = "nick")  private String nick;  @MapsId  @OneToOne(fetch = FetchType.LAZY)  @JoinColumn(name = "id")  private Person person;}   1)我想要的行为是允许单独保存Person类的对象,即不要将它们保存为保存昵称的调用的一部分。2)对于个人的子集,我不妨创建一个昵称。在该假设示例中,每个人只能有一个昵称。3)保存昵称时,我不希望此人对象也被保存。可能是此人可能事先存在,而昵称后来又添加了。当前,当尝试通过NicknameRepository.save(nickname)保存昵称对象(其中昵称对象使用nick和person对象初始化)时,我已经遇到有关实体已存在的异常,如果此人已经存在。4)我确实希望主键ID相同,并且该ID是昵称-> Person中的外键5)保存个人对象时,我也不想保存或添加昵称。6)在为现有人员添加昵称时,我宁愿仅传递人员的ID而不是整个对象。当前,我被迫全部传递Person对象。如果有人可以帮助,那就太好了!
查看完整描述

2 回答

?
catspeake

TA贡献1111条经验 获得超0个赞

我进行了满足我的要求的以下工作。


@Getter

@Setter

@NoArgsConstructor

@Entity

@ToString

@Table(name = "Person")

public class Person {


  @Id

  private UUID id;


  @Column(name = "name")

  private String name;


  @OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.DETACH)

  @PrimaryKeyJoinColumn

  @Fetch(FetchMode.JOIN)

  private NickName nickName;

}


@Getter

@Setter

@NoArgsConstructor

@Entity

@ToString

@Table(name = "nickname")

public class NickName {


  @Id

  private UUID id;


  @Column(name = "nick")

  private String nick;

}  


查看完整回答
反对 回复 2021-04-18
  • 2 回答
  • 0 关注
  • 140 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信