2012-01-11 2 views
1

Я пытаюсь воспроизвести стену Facebook в Java EE.OneToMany JoinTable с не основным значением ключа

У меня есть 3 стола: Пользователь, почта, стена.

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

Дело в том, что проект компилируется только в том случае, если у меня есть на стене, как почта, так и пользователь как ПК. Имея сообщение имеет ПК и пользователя, так как значение, не равное нулю, не будет работать!

Но оба из них, как ПК, приводят к @ManyToMany, что означает, что тот же пост может быть на многих Стенах, что неверно!

Я пытался имея только пост, как ПК в стене и с помощью этого отображения:

Заголовок сообщения:

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

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

@ManyToOne 
private Collection<Post> onWall; 

, но он говорит:

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

Что случилось с моим картографированием? не

ответ

1

Как насчет двух отношений пользователя-Post, один за стену, один за авторство:

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

с обратной отн при необходимости.

Например:

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

Я знаю, но мне кажется, что стена не является обычным объектом. Я имею в виду, что стена должна присоединиться к данным из Почты с данными от пользователя, поэтому я подумал, что это JoinTable! Разве нет способа сделать то, что я задал в своем вопросе? Спасибо за ответ btw :) – StepTNT

+0

@StepTNT Отредактировано. – MaDa

+0

Хорошая точка! :) Еще один вопрос. Не нужно ли новое поле в таблице «Стол» иметь как автора, так и владельца? – StepTNT

Смежные вопросы