【问题标题】:Hibernate / JPA optional one-to-one bidirectional mappingHibernate / JPA 可选的一对一双向映射
【发布时间】:2015-11-16 18:56:11
【问题描述】:

我有两个表,每个表都用于描述一个对象的信息,但来自两个不同的系统。因此,一个给定的对象可能存在于一个、另一个或两者中。

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]

在任何一种情况下,它都会尝试将文本/字符串 common_identifier 列转换为 UUID。我错过了一些简单的东西吗?以错误的方式解决这个问题?还是我想做的事情是不可能的?我不确定“双向一对一映射”是否真的是我应该在谷歌上搜索的内容,呵呵。

明确地说,我不希望任何一个对象拥有另一个对象 - 我只是想查找其中一个对象以补充另一个对象(如果存在)。

感谢您的帮助!

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    我正在使用 JPA 2.1 和 Hibernate 5.0.1。以下对我有用:

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

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

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

    【讨论】:

    • 相当肯定 optional = true 不是必需的;这是默认设置
    • 由于以前版本的 JPA 不支持可选映射,但将其放入其中可能对开发人员友好。
    猜你喜欢
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 2022-01-03
    • 2016-04-19
    • 2011-06-12
    相关资源
    最近更新 更多