2

私は次のコードを書きました:

@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;
    }

...

}

User は Person であり、User は、連絡先として保持したい「人」(Person-s) のセットを持つことができます。したがって、ここにあるのは、継承 (User が Person を派生させる) と集約関係 (User が Person を含む) の両方です。

データベース テーブルに関しては、次の 3 つのテーブルが必要です。

  1. ユーザー
  2. コンタクト

contact テーブルには、user テーブルと person テーブルの両方への外部キーが含まれています。実際には、次の 2 つのテーブル (個人とユーザー) しかありません

私の注釈のいくつかが間違っていると思います...何が間違っていますか?

4

1 に答える 1

2

上記の質問を書いている間、私は私の関係が多対多であることを理解していました.

すべてを修正するコードは次のとおりです。

@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;
    }

...

}

期待どおりの 3 つのテーブルが表示されました: 代替テキスト http://picasaweb.google.com/yaneeve.shekel/ProgrammingRelated#5338298840732620802

  1. ユーザー
  2. コンタクト
于 2009-05-21T15:39:24.830 に答える