OneToMany JoinTable со значением не первичного ключа - PullRequest
1 голос
/ 11 января 2012

Я пытаюсь повторить стену Facebook в Java EE.

У меня есть 3 таблицы: Пользователь, Пост, Стена.

У пользователя есть имя пользователя (PK) и другие поляПочта имеет идентификатор (PK), автора (FK на пользователя) и некоторые другие.Wall - это таблица соединения между пользователем и почтой.

Дело в том, что проект компилируется, только если у меня в Wall есть и почта, и пользователь как PK.Наличие Post имеет PK и User так же, как ненулевое значение не будет работатьНеправильно!

Я пытался использовать Post в качестве PK в Wall и использовать это отображение:

Post:

@JoinTable(name = "Wall", joinColumns = {
    @JoinColumn(name = "id", referencedColumnName = "id")}, inverseJoinColumns = {
    @JoinColumn(name = "user", referencedColumnName = "username")})
@OneToMany
private User user;

Пользователь:

@ManyToOne
private Collection<Post> onWall;

но там написано:

Целевая сущность атрибута отношения [user] в классе [class entity.Post] не может быть определена.Если вы не используете универсальные шаблоны, убедитесь, что целевой объект определен в сопоставлении отношений ..

Что не так с моим отображением?

1 Ответ

1 голос
/ 12 января 2012

Как насчет двух отношений Пользователь-к-сообщению, один для стены, другой для авторства:

  • Пользователь один-ко-многим Сообщение (сообщения прикреплены к стене пользователя, нет объединяющей таблицы),
  • Пользователь один-ко-многим Сообщение (автор сообщения),

с обратными связями по мере необходимости.

Например:

@Entity
public class User {
    @OneToMany(mappedBy="onWall")
    private Collection<Post> wall;

    // You can skip this relationship, if you don't want it
    @OneToMany(mappedBy="author")
    private Collection<Post> authoredPosts;
}

@Entity
public class Post {
    @ManyToOne
    @JoinColumn(name="wallOwnerId")
    private User onWall;

    @ManyToOne
    @JoinColumn(name="authorId")
    private User author;
}
...