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

我正在学习 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 表的外键,反之亦然。


这可能吗?


尚方宝剑之说
浏览 161回答 1
1回答

月关宝盒

该@OneToOne映射是有点奇数球。如果这个关系是双向的,你可以决定所属的一面,但在单向关系的声明实体将永远是一个与外键。一种选择是使关系双向的,但隐藏代码等方向发展。另一种方法是使用一个@OneToMany映射,这将创建一个“多”表的外键。这也与数据库模式相一致,为多个子表中的行会那么至少链接到同一父行理论,尤其是如果有不是一个约束,以确保它们是独一无二的。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java