Hibernate / JPA可选的一对一双向映射

时间:2015-11-16 18:56:11

标签: java hibernate jpa

我有两个表,每个表用于描述有关对象的信息,但来自两个不同的系统。因为这样的给定对象可以存在于一个,另一个或两者中。

service_A
---------------
service_A_pkey UUID NOT NULL PRIMARY KEY,
common_identifier TEXT NOT NULL,
<more columns to store data>

service_B
---------------
service_B_pkey UUID NOT NULL PRIMARY KEY,
common_identifier TEXT NOT NULL,
<more columns to store data>

理想情况下,我希望两个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;
}

应用程序启动,但实际查找ServiceAData对象会导致

org.postgresql.util.PSQLException: ERROR: operator does not exist: character varying = uuid

将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]

在任何一种情况下,它都试图将text / string common_identifier列转换为UUID。我错过了一些简单的事吗?走错了路?或者我正在尝试做什么是不可能的?我不确定“双向一对一映射”是否真的应该用谷歌搜索。

要清楚,我不希望任何一个对象拥有另一个 - 我只是想要查找任何一个对象,如果它存在则补充另一个。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

我正在使用JPA 2.1和Hibernate 5.0.1。以下适用于我:

让两个映射的对象成员都使用以下注释:

@OneToOne(optional = true)
@JoinColumn(name = "common_identifier", referencedColumnName = "common_identifier", insertable = false, updatable = false)

让两个实体都实现Serializable。我不确定为什么这部分是必要的,但似乎是。