Java JPA(Hibernate)单端阻抗失配

Java JPA(Hibernate)单端阻抗失配,java,hibernate,spring-boot,jpa,orm,Java,Hibernate,Spring Boot,Jpa,Orm,我正在学习JPA和Hibernate来构建一个Spring Boot Web应用程序,有些东西让我很烦。 它与一对一关系中的阻抗失配有关 假设我有两个域实体,A和B,它们有一对一的关系 这就是我想要的: 在Java类中,我希望有一个对B的引用 在数据库中,我希望“b”对象的表有一列,外键为“a”键 在SpringBoot中使用JPA和Hibernate有没有办法做到这一点 我在这里报告现实世界中的类和代码的问题 在我的领域里,我基本上有人和签名。 因此,在我的Java代码中,我有Perso

我正在学习JPA和Hibernate来构建一个Spring Boot Web应用程序,有些东西让我很烦。 它与一对一关系中的阻抗失配有关

假设我有两个域实体,A和B,它们有一对一的关系

这就是我想要的:

  • 在Java类中,我希望有一个对B的引用
  • 在数据库中,我希望“b”对象的表有一列,外键为“a”键
在SpringBoot中使用JPA和Hibernate有没有办法做到这一点


我在这里报告现实世界中的类和代码的问题

在我的领域里,我基本上有人和签名。 因此,在我的Java代码中,我有Person@Entity和签名@Entity

在Java中,让Person对象拥有签名对象是有意义的。 下面是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
如您所见,ID应该自动生成,我希望Person类对其签名有一个引用,而不是相反

相反,这是我想要使用的DB模式:

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表的外键,而不是People表的外键


这可能吗?

映射有点奇怪。当关系是双向的时,您可以决定拥有方,但在单向关系中,声明实体将始终是具有外键的实体

一个选项是使关系具有双向性,但在代码中隐藏另一个方向


另一种方法是使用
@OneToMany
映射,它将在“many”表中创建外键。这也与数据库模式一致,因为多个子表行至少在理论上可以链接到同一父行,特别是在没有确保它们唯一性的约束的情况下。

不幸的是,它似乎不起作用:(我得到以下错误:“引用属性未知:com.demo.example.model.Signature.signatures”它在签名对象中查找“signatures”属性。@AndreaRossi啊,是的。有可能使链接双向吗?您可以使其双向,并阻止所有对另一个方向的访问(如果确实必要的话),或者您可以尝试使用
@OneToMany
,这将创建签名
的外键,但是您将有一个1大小的
集合
。似乎无法使用
@OneToOne
从反面获取外键。好的,我已经用@OneToMany方法实现了它,它似乎工作正常。感谢您的支持支持!如果您对此解决方案给出完整答案,我将接受:)