我正在研究JPA和Hibernate,以构建Spring Boot Webapp,但有些问题困扰着我。 与一对一关系中的阻抗失配有关。
比方说,我有两个域实体A和B,它们之间具有一对一的关系。
这就是我想要的:
在Spring Boot中,是否可以使用JPA和Hibernate做到这一点?
我在这里报告现实类和代码的问题。
在我的域中,我基本上有个人和签名。 因此,在我的Java代码中,我有Person @Entity和Signature @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
这是Signature类:
@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表的外键,而不是相反。
这可能吗?
答案 0 :(得分:0)
@OneToOne
映射有点奇怪。当关系是双向的时,您可以决定拥有方,但是在单向关系中,声明实体将始终是具有外键的实体。
一种选择是使关系双向,而在代码中隐藏另一方向。
另一种方法是使用@OneToMany
映射,这将在“许多”表中创建外键。这也与数据库架构一致,因为多个子表行可以至少理论上链接到同一父行,尤其是在没有限制以确保它们唯一的情况下。