2014-11-14 61 views
0

表:person@SecondaryTable映射

id (pk) 
first_name 
last_name 

實體:

@Entity 
@Table(name="person") 
public class Person { 

    @Id 
    @Column(name="id") 
    private String id; 

    @Column(name="first_name") 
    private String firstName; 

    @Column(name="last_name") 
    private String lastName; 

    @Column(name="birthDate") 
    private String birthDate; 

    @Column(name="detail") 
    private String detail; 
} 

表:activity

id(pk) 
name; 

實體:

@Entity 
@Table(name="activity") 
public class Activity { 

    @Id 
    @Column(name="id") 
    private String id; 

    @Column(name="name") 
    private String name; 

    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER) 
    @JoinColumn(name="activity_id") 
    private List<PersonRole> personRoleList; 
} 

表:person_role

activity_id 
person_id 
role_name 
pk(activity_id,person_id) 

實體:

@Entity 
@Table(name="person_role") 
public class PersonRole { 


     @Id 
     PersonRolePK personRolePk; 


    // private String personName; /* I want this value to be loaded form person table using the person_id when a PersonRole is reader from database */ 


     @Column(name="role_name") 
     private String roleName; 

} 


@Embeddable 
public class PersonRolePK implements Serializable 
{ 
    public static final long serialVersionUID = 1L; 

    @Column(name="activity_id") 
    public String activityId; 

    @Column(name="person_id") 
    public String personId; 

} 

這是爲我工作很好,當我在數據庫中存儲數據

它也如預期,並加載所有相關PersonRole當我想要從數據庫的活動

現在除此之外,我想在PersonRole加載時從person表中填入(註釋)類的personName字段。

我閱讀了關於@SecondaryTable的註釋,並與它接近。

但問題是所有的教程和文檔也http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#d0e2235)顯示 ,如果我想映射輔助表,有必要在兩個表中具有相同數量的主鍵字段(如果複合鍵)而那些申請將使用@PrimaryKeyJoinColumn

映射但在我的情況下,沒有必要使用多個鍵此人擁有一個主鍵

那麼,有沒有一種方法來映射包含複合主鍵的表包含單個主鍵的表格使用@SecondaryTable

OR,

是否有任何其他好的方法來實現我想要什麼?

回答

1

通常在這種情況下,我會在活動和人員pojo中有OneToMany關係。而且在PersonRole pojo中,您可以爲每個Activity和Person創建一個ManyToOne關係,這樣可以在不重複數據(personname)的情況下獲取所需的所有數據。

在Person pojo中添加OneToMany。

Set<PersonRole> personRoles = new HashSet<PersonRoles>(); 

@OneToMany(fetch = FetchType.EAGER, mappedBy = "person") 
public Set<PersonRole> getPersonRoles() { 
    return this.personRoles; 
} 
public void setPersonRoles(Set<PersoneRole> personRoles) { 
    this.personRoles = personRoles; 
} 

在PersonRole pojo中添加ManyToOne關係。

Private Person person; 
Private Activity activity; 

@ManyToOne(fetch = FetchType.EAGER) 
@JoinColumn(name = "person_id") 
public Person getPerson() { 
    return this.person; 
} 
public void setPerson(Person person) { 
    this.person = person; 
} 

@ManyToOne(fetch = FetchType.EAGER) 
@JoinColumn(name = "activity_id") 
public Activity getActivity() { 
    return this.activity; 
} 
public void setActivity(Activity activity) { 
    this.activity = activity; 
} 

在查詢活動時,您現在應該能夠從Person中獲得該名稱。

+0

我必須說這是一個好方法。但我只需要'first_name'和'last_name'而不是'Person'的引用它自己。和'人'pojo可以有一些其他領域像'birthDate''detail'(我道歉我沒有添加這些問題) – Saif 2014-11-15 06:28:03

+0

我可以得到一些選擇性領域使用ManyToOne? – Saif 2014-11-15 06:29:55