2016-09-28 12 views
0

私は2つのエンティティにIDの注釈が付けられていますが、それらのIDはテーブルの主キーではありません。私はまだ変更の初期の影響を制限するためにPKのエンティティをエンティティにマッピングしています。しかし、多くの関係に多くを関連付けるためにPKのを使用して関連テーブルには、次のエラーがスローされます。Hibernate関連テーブル

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
  • は、Hibernate、テーブルのデータを表すフィールドに@Idと@GeneratedValueを入れて長い(sgbd)をマッピングします長い(表)を聖霊降臨祭

または

  • あなた( sgbd)テーブルのデータ型は、(java)uuid型と互換性がなければなりません。

なぜこれらの2つのキーがテーブルにありますか?

1つのエンティティに2つのPKを割り当てることはできないと思います。ほとんどの場合、シリアルIDとUUIDに複合キーベースを設定できます。

は@Idとしてその

やマークSGBDで本当のPKのためHow to map a composite key with Hibernate?を参照してください。一言で言えば

@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を追加し、:

+0

セキュリティ上のリスクがあり、PKとしてUUIDを使用した場合のパフォーマンスが低下するのを避けるため、シリアルIDの列を公開したくはありません。シリアルIDはまだエンティティにマッピングされているため、私は作業を段階的に行うことができますが、エンティティIDであることは望ましくありません。 – peekay

+0

もし私が正しく理解したら、IDの変更を許可したくないのですか? 参照http://stackoverflow.com/a/2217064/2710704 – Tokazio

+0

私はもともとシーケンシャルIDをどこでも使用していました。今私はUUIDのに変換しているセキュリティ監査の後、私は潜在的なパフォーマンスの問題のためにPKのとしてUUIDを使用したくない。 – peekay

0

私が行くことにしたソリューションビューのテーブルの点で、古典的な値として、Javaで他を使用して、次のようですCustomer Entityの両方の列を使用しました。

UUIDとシリアルIDの使用に関する@ Tokazioの質問に対処するには、データウェアハウスの変換が大幅に影響を受けるため、シリアルIDからUUIDにゆっくりと移行する必要があります。

関連する問題