我有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;
有谁知道这是否可能?或者,当我推动此更改时,我是否会被迫更新关联表中的内容?
答案 0 :(得分:0)
或
为什么桌子上有这两个按键?
我认为一个实体不可能拥有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以最大限度地减少影响并防止停电。