我正在學習 JPA 和 Hibernate 來構建一個 Spring Boot webapp,但有一些問題困擾著我。它與一對一關系中的阻抗失配有關。假設我有兩個域?qū)嶓w A 和 B,它們具有一對一的關系。這就是我想要的:在 Java 類中,我希望 A 持有對 B 的引用;在數(shù)據(jù)庫中,我希望“b”對象的表有一個帶有“a”鍵外鍵的列。有沒有辦法在 Spring Boot 中使用 JPA 和 Hibernate 來做到這一點?我在這里報告了現(xiàn)實世界中的類和代碼的問題。在我的域中,我基本上有人和簽名。因此,在我的 Java 代碼中,我有 Person @Entity 和簽名 @Entity。在 Java 中,讓 Person 對象擁有一個 Signature 對象是有意義的。所以,這里是 Person 類:@Entity@Table(name = "people")public class Person { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "id") private long id; @Column(name="first_name") @NotNull @NotBlank @Size(min = 3, max = 100) private String firstName; @Column(name="last_name") @NotNull @NotBlank @Size(min = 3, max = 100) private String lastName; // ??? which annotations? private Signature signature; // I omit constructors, getters and setters for brevity這是簽名類:@Entity@Table(name = "signatures")public class Signature { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "id") private long id; @Column(name="name") @NotNull @NotBlank private String name; @Column(name="type") @NotNull private String type; @Column(name="image") @NotNull @NotEmpty @Lob @Type(type="org.hibernate.type.MaterializedBlobType") private byte[] image; // I omit constructors, getters and setters for brevity如您所見,Ids 應該自動生成,我希望我的 Person 類能夠引用它的 Signature,反之亦然。相反,這是我想使用的數(shù)據(jù)庫模式:CREATE SCHEMA signatures;CREATE TABLE signatures.people ( id BIGSERIAL, first_name VARCHAR(100) NOT NULL, last_name VARCHAR(100) NOT NULL, PRIMARY KEY (id));CREATE TABLE signatures.signatures ( id BIGSERIAL, type VARCHAR[16] NOT NULL, name VARCHAR[100] NOT NULL, image BYTEA NOT NULL, person BIGINT NOT NULL, PRIMARY KEY (id), CONSTRAINT fk_signature_people FOREIGN KEY (person) REFERENCES signatures.people (id) ON DELETE CASCADE ON UPDATE CASCADE);正如您在此處看到的,我希望 Signatures 表具有指向 People 表的外鍵,反之亦然。這可能嗎?
1 回答

月關寶盒
TA貢獻1772條經(jīng)驗 獲得超5個贊
該@OneToOne
映射是有點奇數(shù)球。如果這個關系是雙向的,你可以決定所屬的一面,但在單向關系的聲明實體將永遠是一個與外鍵。
一種選擇是使關系雙向的,但隱藏代碼等方向發(fā)展。
另一種方法是使用一個@OneToMany
映射,這將創(chuàng)建一個“多”表的外鍵。這也與數(shù)據(jù)庫模式相一致,為多個子表中的行會那么至少鏈接到同一父行理論,尤其是如果有不是一個約束,以確保它們是獨一無二的。
添加回答
舉報
0/150
提交
取消