2016-09-28 106 views
0

我有两个实体有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; 

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

回答

0
  • 把@Id和@GeneratedValue上表示表数据的字段,则Hibernate将映射长(SGBD)白衣长(表)

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

为什么这两个键在你的桌子上?

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

看到How to map a composite key with Hibernate?

或标记为@Id在SGBD真正的PK。在Java中使用其他如在视图

+0

我不想暴露串行ID列,因为这是一个安全风险,并且为了避免使用UUID作为PK的性能打击,我想保留串行ID作为PK。串行标识仍然映射到实体,所以我可以分阶段完成这项工作,但我不希望它是实体标识。 – peekay

+0

如果我正确理解,你不想让id修改? 请参阅http://stackoverflow.com/a/2217064/2710704 – Tokazio

+0

我最初在各处都使用顺序标识。现在,在进行安全审计后,我将转换为UUID,但由于潜在的性能问题,我不想将UUID用作PK。 – peekay

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和串行标识的问题,数据仓库转换会受到显着影响,因此我需要从串行标识缓慢移动到UUID以最大限度地降低影响并防止停机。