java - JPA(休眠)OneToOne 阻抗不匹配
问题描述
我正在研究 JPA 和 Hibernate 来构建一个 Spring Boot webapp,但有些东西让我很头疼。它与一对一关系中的阻抗不匹配有关。
假设我有两个域实体 A 和 B,它们具有一对一的关系。
这就是我想要的:
- 在 Java 类中,我想让 A 持有对 B 的引用;
- 在数据库中,我想让“b”对象的表有一个带有“a”键的外键的列。
有没有办法在 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
这是签名类:
@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 表的外键,反之亦然。
这可能吗?
解决方案
@OneToOne
映射有点奇怪。当关系是双向的时,您可以决定拥有方,但在单向关系中,声明实体将始终是具有外键的实体。
一种选择是使关系双向,但在代码中隐藏另一个方向。
另一种方法是使用@OneToMany
映射,它将在“many”表中创建外键。这也与数据库模式一致,因为至少在理论上,多个子表行可以链接到同一个父行,特别是如果没有约束来确保它们是唯一的。
推荐阅读
- xcode - Xcode 目标的 Git 分支
- android - 无障碍服务无法读取所有屏幕内容
- sql - sql cte 将两个结果合并为一个共同点
- angular - Nativescript Angular 2 - 显示标签的前 40 个字符并在按钮单击时显示更多
- html - 带有变换旋转(90度)的html div元素在chrome中消失
- javascript - 如何设置变量
- bash - 使用 fswatch 和 rsync 自动同步目录时找不到文件
- android - 无法从 Android WebView 拨打电话
- sql-server - 替换 SQL 透视查询中的空值
- jupyter-notebook - 配置 jupyter 仪表板服务器