Hibernate关联表

时间:2016-09-28 20:25:04

标签: java hibernate jpa

我有2个具有Id注释的实体,但这些ID不是表中的主键。我现在仍然将PK映射到实体,以限制更改的初始影响。但是使用PK关联多对多关系的关联表引发了以下错误:

java.lang.IllegalArgumentException: Provided id of the wrong type for class. Expected: class java.util.UUID, got class java.lang.Long

实体@Id是UUID但是表格PK是一个Long被映射为@JoinColumn

关联实体的复合键

@Embeddable
public class CustomerAccountId implements Serializable {
    private static final long serialVersionUID = 1L;

    @Column(name = "user_id", nullable = false)
    private Long customerId;

    @Column(name = "account_id", nullable = false)
    private Long accountId;

协会实体:

    @EmbeddedId
@AttributeOverrides({
    @AttributeOverride(name = "customerId", column = @Column(name = "user_id", nullable = false)),
    @AttributeOverride(name = "accountId", column = @Column(name = "account_id", nullable = false))
})
private CustomerAccountId id;

@ManyToOne
@JoinColumn(name = "user_id", insertable = false, updatable = false, referencedColumnName = "user_id")
private Customer customer;

@ManyToOne
@JoinColumn(name = "account_id", insertable = false, updatable = false, referencedColumnName = "id")
private Account account;

失败的实体:

@Column(name = "user_id")
private Long serialId;  // also the primary key in the table

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@org.hibernate.annotations.Type(type="pg-uuid")
@Column(name = "uid", updatable = false)
private UUID id;

有谁知道这是否可能?或者,当我推动此更改时,我是否会被迫更新关联表中的内容?

2 个答案:

答案 0 :(得分:0)

  • 将@Id和@GeneratedValue放在代表表数据的字段上,然后hibernate将映射一个long(sgbd)whit a long(table)

  • 您的(sgbd)表数据类型必须与(java)uuid类型兼容。

为什么桌子上有这两个按键?

我认为一个实体不可能拥有2个PK。您最多可以在serialID和UUID上使用复合键。

请参阅How to map a composite key with Hibernate?了解

或者将@Id标记为SGBD中的真实PK。使用Java中的另一个作为表格视角中的经典值

答案 1 :(得分:0)

我决定采用的解决方案如下:

@ManyToOne
@JoinColumns ( value = {
    @JoinColumn(name = "user_id", insertable = false, updatable = false, referencedColumnName = "user_id"),
    @JoinColumn(name = "user_uid", insertable = false, updatable = false, referencedColumnName = "uid")
})
private Customer customer;

简而言之,我只是将UUID添加到关联表中,并将两列用于客户实体。

要解决@ Tokazio关于使用UUID和序列ID的问题,数据仓库转换会受到显着影响,因此我需要慢慢从序列ID转移到UUID以最大限度地减少影响并防止停电。