我正在学习 JPA 和 Hibernate 来构建一个 Spring Boot webapp,但有一些问题困扰着我。它与一对一关系中的阻抗失配有关。假设我有两个域实体 A 和 B,它们具有一对一的关系。这就是我想要的:在 Java 类中,我希望 A 持有对 B 的引用;在数据库中,我希望“b”对象的表有一个带有“a”键外键的列。有没有办法在 Spring Boot 中使用 JPA 和 Hibernate 来做到这一点?我在这里报告了现实世界中的类和代码的问题。在我的域中,我基本上有人和签名。因此,在我的 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,反之亦然。相反,这是我想使用的数据库模式: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条经验 获得超5个赞
该@OneToOne
映射是有点奇数球。如果这个关系是双向的,你可以决定所属的一面,但在单向关系的声明实体将永远是一个与外键。
一种选择是使关系双向的,但隐藏代码等方向发展。
另一种方法是使用一个@OneToMany
映射,这将创建一个“多”表的外键。这也与数据库模式相一致,为多个子表中的行会那么至少链接到同一父行理论,尤其是如果有不是一个约束,以确保它们是独一无二的。
添加回答
举报
0/150
提交
取消