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

JPA(休眠)一对一阻抗不匹配

JPA(休眠)一对一阻抗不匹配

尚方宝剑之说 2021-08-04 16:45:20
我正在学习 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映射,这将创建一个“多”表的外键。这也与数据库模式相一致,为多个子表中的行会那么至少链接到同一父行理论,尤其是如果有不是一个约束,以确保它们是独一无二的。


查看完整回答
反对 回复 2021-08-04
  • 1 回答
  • 0 关注
  • 160 浏览

添加回答

举报

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