mru*_*nak 5 java hibernate jpa
我有两个表,每个表都用于描述有关对象的信息,但来自两个不同的系统。因此,给定的对象可以存在于其中一个、另一个或两者中。
service_A
---------------
service_A_pkey UUID NOT NULL PRIMARY KEY,
common_identifier TEXT NOT NULL,
<more columns to store data>
Run Code Online (Sandbox Code Playgroud)
和
service_B
---------------
service_B_pkey UUID NOT NULL PRIMARY KEY,
common_identifier TEXT NOT NULL,
<more columns to store data>
Run Code Online (Sandbox Code Playgroud)
理想情况下,我希望两个 JPA 实体都包含彼此的引用(如果存在),这样如果我使用任一存储库来查找给定服务的对象,它就会附带来自其他服务的“额外”信息,而无需执行以下操作更多手动查找。从网络上的其他示例来看,我认为这样的方法会起作用:
@Entity
@Table(name = "service_A")
public class ServiceAData {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "service_A_pkey")
private UUID pkey;
@Column(name = "common_identifier", nullable = false)
private String commonIdentifier;
@OneToOne(optional = true, mappedBy = "serviceAData")
private ServiceBData serviceBData;
}
@Entity
@Table(name = "service_B")
public class ServiceBData {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "service_B_pkey")
private UUID pkey;
@Column(name = "common_identifier", nullable = false)
private String commonIdentifier;
@OneToOne(optional = true)
@JoinColumn(name = "common_identifier", insertable = false, updatable = false)
private ServiceAData serviceAData;
}
Run Code Online (Sandbox Code Playgroud)
应用程序启动,但实际查找 ServiceAData 对象会导致
org.postgresql.util.PSQLException: ERROR: operator does not exist: character varying = uuid
Run Code Online (Sandbox Code Playgroud)
将ServiceAData的注释更改为与ServiceBData的注释完全相同(即@OneToOne上没有mappedBy属性,并添加@JoinColumn)会导致本质上相同的问题
Caused by: java.lang.IllegalArgumentException: Invalid UUID string: CCGNG23DG0WQ
at java.util.UUID.fromString(UUID.java:194) ~[na:1.7.0_65]
Run Code Online (Sandbox Code Playgroud)
无论哪种情况,它都会尝试将文本/字符串 common_identifier 列转换为 UUID。我错过了一些简单的事情吗?处理这个问题的方式是错误的吗?或者我想做的事情根本不可能实现?我不确定“双向一对一映射”是否真的是我应该谷歌搜索的内容,呵呵。
需要明确的是,我不希望任何一个对象拥有另一个对象 - 我只是想查找其中一个对象以补充另一个对象(如果存在)。
谢谢你的帮助!
我正在使用 JPA 2.1 和 Hibernate 5.0.1。以下对我有用:
让两个映射对象成员使用以下注释:
@OneToOne(optional = true)
@JoinColumn(name = "common_identifier", referencedColumnName = "common_identifier", insertable = false, updatable = false)
Run Code Online (Sandbox Code Playgroud)
让两个实体都实现可序列化。我不确定为什么这部分是必要的,但似乎是必要的。