我有两个实体有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这是一个长期被映射为@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;
有谁知道这是否可能?或者当我推动这个改变时,我将被迫更新关联表中的内容?
我不想暴露串行ID列,因为这是一个安全风险,并且为了避免使用UUID作为PK的性能打击,我想保留串行ID作为PK。串行标识仍然映射到实体,所以我可以分阶段完成这项工作,但我不希望它是实体标识。 – peekay
如果我正确理解,你不想让id修改? 请参阅http://stackoverflow.com/a/2217064/2710704 – Tokazio
我最初在各处都使用顺序标识。现在,在进行安全审计后,我将转换为UUID,但由于潜在的性能问题,我不想将UUID用作PK。 – peekay