簡體   English   中英

Spring JPA 中的一對一共享主鍵映射問題

[英]One To One shared primary key mapping issue in Spring JPA

我是 Spring JPA 的新手,正在努力保存 object

'表'

  1. 父表

書頭

uid int (PK), booknum varchar

  1. 子表

圖書信息

bookid(FK)(PK),備注 varchar

BookHeader.java...

@Entity
@Table(name="tbookheader", schema="v2")
public class BookHeader implements Serializable{

  @Id
  @SequenceGenerator(name="seq-gen",sequenceName="v2.tbookheader_uid_seq",  allocationSize = 1)
  @GeneratedValue(strategy= GenerationType.IDENTITY, generator="seq-gen")
  @Column(name = "uid")
  private int uid;

  @Column(name = "booknum")
  private String bookNum;

  @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "bookHeader")
  private BookInfo bookInfo;
}

BookInfo.java

@Entity
@Table(name="tbookinfo", schema="v2")
public class BookInfo implements Serializable{

  @Id
  @Column(name = "bookid")
  private int uid;

  @OneToOne
  @JoinColumn(name="bookid",referencedColumnName="uid")
  private BookHeader bookHeader;

  private String remark;
}

我從 json 得到 object 並使用 ZB0AA3DCF498BF4C701ADB4396BB1B4 將 josn 轉換為 object

現在我正在嘗試通過 SPRING JPA 保存它

{

    BookHeader.setBookNum("tesetbooking3");

    BookHeader.setUserDate(new Date());

    BookHeader.setUserid(1111);

    BookHeader.setCrtDate(new Date());

    BookHeader.setCrtUserId(1111);

    return bookHeaderRepository.save(BookHeader);
}

但我得到了例外:

ERROR: insert or update on table "tbookinfo" violates foreign key constraint 
"fk_tbookinfo_bookid"
  Detail: Key (bookid)=(0) is not present in table "tbookheader".

似乎生成的主鍵不是從父表傳遞的。

有人可以幫助我。

TIA。

id屬性從int更改為Integer

int屬性的默認值為0 ,這是一個有效的外鍵,但在 DB 中沒有具有該鍵的 object。

首先,您創建了一個@OneToOne ,但您沒有做任何事情來表明這是一個共享主鍵 model。

書頭:

@Entity
@Table(name="tbookheader", schema="v2")
public class BookHeader implements Serializable{

  @Id
  @SequenceGenerator(name="seq-gen",sequenceName="v2.tbookheader_uid_seq",  
                           allocationSize = 1)
  @GeneratedValue(strategy= GenerationType.IDENTITY, generator="seq-gen")
  @Column(name = "uid")
  private Long uid;

  @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "bookHeader")
  private BookInfo bookInfo;
}

圖書信息:

@Entity
@Table(name="tbookinfo", schema="v2")
public class BookInfo implements Serializable{

  @Id //dependent on BookHeader for Id
  @OneToOne
  @JoinColumn(name="bookid",referencedColumnName="uid")
  private BookHeader bookHeader;
}

其次,對於雙向關系 - 正如您在此處所擁有的 - 您必須確保在持久化之前在內存 model 上正確設置關系的雙方。

BookHeader header - new BookHeader();
BookInfo info = new BookInfo();
header.setBookInfo(info);
info.setBookHeader(header);//will fail without this
bookHeaderRepository.save(header);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM