наследование jpa и отношение OneToMany - PullRequest
1 голос
/ 21 мая 2009

Я написал следующий код:

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

...

}

Пользователь - это Персона, и у Пользователя может быть набор "людей" (Персон), которые он хочет сохранить в качестве контактов. Итак, здесь у меня есть как наследование (пользователь получает лицо), так и отношение агрегации (пользователь содержит лица).

С точки зрения таблиц базы данных я бы ожидал 3 таблицы:

  1. человек
  2. Пользователь
  3. контакт

Где таблица контактов содержит внешние ключи для таблиц пользователя и персоны. На самом деле у меня есть только следующие две таблицы (человек и пользователь): альтернативный текст http://picasaweb.google.com/yaneeve.shekel/ProgrammingRelated#5338298839877393922

Я полагаю, что некоторые из моих аннотаций неверны ... Что я сделал не так?

1 Ответ

1 голос
/ 21 мая 2009

При написании вопроса выше, я понял, что у меня много отношений со многими, так как человек может быть контактом многих пользователей, в то время как пользователь, конечно, может иметь много контактов.

Вот код, чтобы все это исправить:

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

...

}

Теперь я получаю три таблицы, которые я ожидал: альтернативный текст http://picasaweb.google.com/yaneeve.shekel/ProgrammingRelated#5338298840732620802

  1. человек
  2. Пользователь
  3. контакт
...