2016-06-27 10 views
0

のための追加のマッピング私は、たとえば、ターゲットのIDの追加のマッピングを持つ単方向@ManyToOneマッピングの例を見て:私たちはのための追加のマッピングを必要とする理由休止状態@ManyToOneとターゲットのid

@Entity 
public class Person { 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "company_id") 
    private Company company; 

    @Column(name = "company_id", insertable = false, updatable = false) 
    private Long companyId; 

    ... 
} 

私は理解していませんcompanyId。誰かがこのトリックを説明できますか?

+0

前述のように、CompanyIdフィールドは必要ありません。ただし、識別子を直接入力せずに直接アクセスする場合は、便利です。 getCompany()。getId()呼び出し。nullの可能性があります。私の知る限り、追加の識別子フィールドは広く使われていません。 – Marius

答えて

0

companyIdの追加マッピングはオプションです。ビジネスロジックによって異なりますが、JPAでは必要ありません。 companyIdを表示するだけでよい場合は、getCompanyId()がgetCompany()。getId()より高速になる場合があります。私は私の答えを参照したい

0

- >https://stackoverflow.com/a/35549928/5909679

まず第一に、あなたのPerson -entityとCompany -entityはある種のIDを必要とする...さらに、あなたは、一方向のOneToManyを持つことができますManyToOneには双方向の関係が必要です。

あなたのフィールドcompanyIdは全く必要ではなく、ManyToOneには影響しません。 JoinColumn注釈が必要です。これは、ジョインテーブルの中であなたの望むカラム名を宣言します。以下のようにそれを実行します。

あなたPerson -entityでは:あなたのCompany -entityで

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

@ManyToOne //FetchType.LAZY is by default 
@JoinColumn(name = "company_id") 
private Company company; 

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

@OneToMany(mappedBy = "company") 
private List<Person> persons; 

あなたが参加し、テーブルの命名のより多くの制御を持っているしたい場合次のように宣言します。

@ManyToOne 
@JoinTable(name="desired_table_name", joinColumns={@JoinColumn(name="person_id", referencedColumnName="id")}, inverseJoinColumns={@JoinColumn(name="company_id", referencedColumnName="id")}) 
private Company company;