2016-11-28 19 views
0

したがって、私は彼のタイプで単純なリレーションクライアントを持っています。すべてのエンティティはIDとソースシステムIDによって識別されるので、私はどこでも複合キーを持っています。クライアントエンティティを保存しているときに自動的に入力する方法プライマリキーと外部キーとしてのHibernateマッピングフィールド

Clientクラス:

public class Client implements Serializable { 

    @EmbeddedId 
    private ClientKey primaryKey; 

    @ManyToOne 
    @JoinColumns({ 
     @JoinColumn(insertable = false, updatable = false, name = "client_type", referencedColumnName = "dict_id"), 
     @JoinColumn(insertable = false, updatable = false, name = "client_own_id", referencedColumnName = "dict_own_id"), 
    }) 
    private Type type; 

} 

主キー

@Embeddable 
public class ClientKey implements Serializable { 

    @Column(name = "client_id") 
    private String clientId; 
    @Column(name = "client_own_id") 
    private String clientOwnId; 

} 

型クラス

@Entity 
public class Type implements Serializable { 

    @EmbeddedId 
    private DictKey primaryKey; //dict_id and dict_own_id 

    ... 
} 

私はコードを実行しています:

clientRepo.create(client); //client contains setted type as typeRepo.getById(1). 

トランザクション後、クライアントは保存されましたが、client_type列にはnullが含まれています。私が理解したところでは、問題は挿入可能/更新可能= falseです。だから私は

@JoinColumn(insertable = true, updatable = true, name = "client_type", referencedColumnName = "dict_id"), //true since I want to have updated client_type field 
@JoinColumn(insertable = false, updatable = false, name = "client_own_id", referencedColumnName = "dict_own_id"), //false since I have this field in primary key already 

をsettedその後私は取得しています:

Mixing insertable and non insertable columns in a property is not allowed 

は、私は本当の両方を設定しています:

@JoinColumn(insertable = true, updatable = true, name = "client_type", referencedColumnName = "dict_id"), //true since I want to have saved client_type field 
@JoinColumn(insertable = true, updatable = true, name = "client_own_id", referencedColumnName = "dict_own_id"), //true because I dont know why :D 

を、その後:

repeated column in mapping for entity: Client column: client_own_id (should be mapped with insert="false" update="false") 

私はこれ以上を持っていませんアイデア...

編集:私はクライアントエンティティへの関係を持っている場合は、以下の は、ことを除いて正常に見える:

@ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumns({ 
    @JoinColumn(insertable = false, updatable = false, name = "client_id", referencedColumnName = "client_id"), 
    @JoinColumn(insertable = false, updatable = false, name = "client_own_id", referencedColumnName = "client_own_id"), 
}) 
    private Client client; 

I'amはあなたがここに持っていることは、クライアントが持っている場合であるように見えます

Unable to find column with logical name: client_own_id in client 
+0

[引用]トランザクションの後、私はクライアントに保存されているが、 client_status列にはnullがあります。[end quote]あなたのコードでclient_status列はどこにありますか? – borowis

+0

sry私はスペルが間違っています。 status = type。私はそれを修正しました – user2771738

答えて

0

を取得その部分的に派生した複雑なKeyをTypeに関連付けます。この場合

私はマッピングは以下のようにあるべきだと思う:

Entityクラス:

public class Client implements Serializable { 

    @EmbeddedId 
    private ClientKey primaryKey; 

    @MapsId("type") //maps to type in the EmbdeddedId 
    @ManyToOne 
    @JoinColumns({ 
     @JoinColumn(name = "client_type", referencedColumnName = "dict_id"), 
     @JoinColumn(name = "client_own_id", referencedColumnName = "dict_own_id") 
    }) 
    private Type type; 
} 

EmbeddedId:

@Embeddable 
public class ClientKey implements Serializable { 
    @Column(name="client_id") 
    private String clientId; 

    @Embedded 
    private DictKey type; 

    //... 
} 
+0

クライアントの論理名:client_own_idの列を見つけることができません/ プライマリキーの埋め込みdictキーは、client_type、client_own_idに上書きされるべきではありませんか? – user2771738

+0

これは質問ですか、実際の声明ですか、エラーメッセージですか、それとも何ですか? –

+0

これはエラーです。クライアントと主キーでclient_own_idが発生するたびにclient_own_idに変更され、それでもonclient_own_idに失敗します。リレーションシップはclient_own_id列を参照しないため、エンティティとクライアントの関係は今や崩れています – user2771738

関連する問題