2009-05-21 111 views
0

我寫了下面的代碼:JPA繼承和一對多關係

@Entity 
@Table(name="person") 
@Inheritance(strategy=InheritanceType.JOINED) 
public class Person { 

    private Long id; 

    protected String email; 
    private String firstName; 
    private String lastName; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    public Long getId() { 
     return id; 
    } 

... 

} 


@Entity 
@Table(name="users") 
@ForeignKey(name="userPersonId") 
public class User extends Person { 

    private String userName; 
    private String password; 
    private Date registrationDate; 
    private Set<? extends Person> contacts; 

    @OneToMany(targetEntity = com.blah.Person.class ,fetch = FetchType.LAZY, cascade=CascadeType.ALL) 
    @ForeignKey(name="contactId") 
    @JoinColumn(name="contactId") 
    public Set<? extends Person> getContacts() { 
     return contacts; 
    } 

... 

} 

用戶在一個人與一個用戶可以擁有一組「人」(人-S),它希望保持作爲聯繫人。所以,我在這裏的是繼承(用戶派生人)和聚合關係(用戶包含人 - S)。

在數據庫表方面我希望3個表:

  1. 用戶
  2. 接觸

凡接觸表包含外鍵的用戶和人表。 實際上我只有以下兩個表(個人和用戶): alt text http://picasaweb.google.com/yaneeve.shekel/ProgrammingRelated#5338298839877393922

我想,我的一些註釋是不正確的......我做了什麼錯?

回答

1

在寫上面的問題時,我發現我的關係是多對多的,因爲一個人可能是許多用戶的聯繫人,而用戶當然可以有很多聯繫人。

這裏是解決它的全部代碼:

@Entity 
@Table(name="users") 
@ForeignKey(name="userPersonId") 
public class User extends Person { 

    private String userName; 
    private String password; 
    private Date registrationDate; 
    private Set<? extends Person> contacts; 

    @ManyToMany(targetEntity = com.blah.Person.class, fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
    @ForeignKey(name = "contactUserId", inverseName = "contactPersonId") 
    @JoinTable(name = "contact", joinColumns = {@JoinColumn(name = "userId")}, inverseJoinColumns = {@JoinColumn(name = "personId")}) 
    public Set<? extends Person> getContacts() { 
     return contacts; 
    } 

... 

} 

我現在得到了三個表我的預期: alt text http://picasaweb.google.com/yaneeve.shekel/ProgrammingRelated#5338298840732620802

  1. 用戶
  2. 接觸