2017-09-08 4 views
1

私は@OneToOne注釈で接続されている2つのエンティティを持っています。よりよく理解するためにまず私のクラス:エントリを作成するが、@OneToOneにFKを設定しないHibernate

第二エンティティ:

@Table(name = "REASON_FOR_CLIENT_CHEQUE_PAYMENT_REVERSAL") 
@Entity 
public class ReversalReason implements Serializable{ 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 3338809410372872259L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer code; 

    private boolean tax; 
    private boolean currency; 
    private boolean amountChange; 
    private boolean locationChange; 
    private boolean recipient; 
    private boolean period; 

    public ReversalReason() { 

    } 
} 

基本エンティティ:

@Table(name = "CLIENT_CHEQUE_PAYMENT") 
@Entity 
public class ClientChequePayment extends BaseDomainObject implements Serializable { 
    /** Serial version UID */ 
    private static final long serialVersionUID = -1988633355L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer code; 

    @OneToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "code", nullable = true) 
    private ReversalReason reasonForReversal; 

    @Column(nullable = true, length = 50) 
    private String proposeReversalUser; 
    @Column(length = 50, unique = true) 
    private String displayCode; 
    @Column(length = 50) 
    private String originalEntry; 

    private PaymentStatus originalPaymentStatus; 

そうでない場合は、コードがあまりにも多くなりますので、私はいくつかのフィールドをOMMITんでした。

私のプログラムではのフィールドをClientChequePaymentに設定して、session.update(clientChequePayment);に設定したいと考えています。私はフィールドがupdateを呼び出す前に設定されていたかどうかを確認しました。問題は、休止状態でReversalReasonのエントリが作成されますが、ReversalReasonのPKがClientChequePaymentエントリのFKとして設定されていないことです。そのため、私はを1 ClientChequePaymentに登録することができます。

私のマッピングは正しいですか?経由でClientChequePaymentにアクセスする必要はありませんが、その逆もあります。マッピングは双方向でなければならないのですか?

+0

私は、「CLIENT_CHEQUE_PAYMENTは」「コード」という名前の列を持っていると仮定していることは正しいでしょうか? –

+0

@MárioFernandesそうです。列の名前を変更する必要がありますか、または別の回避策がありますか? – XtremeBaumer

+0

これはやや奇妙です。両方のテーブルの主キーが同じ(両方とも 'code')ですか?それはコードが言っていることなので。そうでなければ、外部キーが完全に失われています –

答えて

1

コメントから続きます。

これは問題です。外部キーがREASON_FOR_CLIENT_CHEQUE_PAYMENT_REVERSALになっている列が必要です。 、id_reversal_reasonのようなものをREASON_FOR_CLIENT_CHEQUE_PAYMENT_REVERSALへの外部キーを必要とし、あなたが行うことができますCLIENT_CHEQUE_PAYMENT

意味、あなたのテーブル:

@OneToOne(cascade = CascadeType.ALL) 
@JoinColumn(name = "id_reversal_reason", nullable = true) 
private ReversalReason reasonForReversal; 

が結合列は、ソース表の所有テーブルの上にあります。

@JoinColumnのjavadocからnameからの抜粋:

(Optional) The name of the foreign key column. 
* The table in which it is found depends upon the 
* context. 
* <ul> 
* <li>If the join is for a OneToOne or ManyToOne 
* mapping using a foreign key mapping strategy, 
* the foreign key column is in the table of the 
* source entity or embeddable. 
+0

が含まれていません 'reasonForReversal'という名前の列があります外部キー。私は '@ JoinColumn'が私がフェッチしたいレコードを指し示す必要があると思いました。とにかく、私はあなたの提案を試します – XtremeBaumer

+0

それはあなたが使用する必要がある列です:) –

+0

それは働いて、非常にありがとう – XtremeBaumer

関連する問題