Как управлять One-To-One и One-To-Many того же типа, что и однонаправленное отображение?

Я пытаюсь реализовать модель для личных сообщений между двумя или более пользователями.

Это означает, что у меня есть две сущности:

  • пользователь
  • Личное сообщение

Модель User не должна редактироваться, поэтому я пытаюсь установить однонаправленные отношения:

@Entity (name = "User")
@Table (name = "user")
public class User implements Serializable {
@Id
String username;
String password;
// something like this ...
}

Модель PrivateMessage адресована нескольким получателям и имеет ровно одного отправителя. Поэтому мне нужно что-то вроде этого:

@Entity (name = "PrivateMessage")
@Table (name = "privateMessage")
@XmlRootElement
@XmlType (propOrder = {"id", "sender", "receivers",
        "title", "text", "date", "read"})
public class PrivateMessage implements Serializable {

    private static final long serialVersionUID = -9126766942868177246L;

    @Id
    @GeneratedValue
    private Long id;

    @NotNull
    private String title;

    @NotNull
    private String text;

    @NotNull
    @Temporal(TemporalType.TIMESTAMP)
    private Date date;

    @NotNull
    private boolean read;

    @NotNull
    @ElementCollection(fetch = FetchType.EAGER, targetClass = User.class)
    private Set<User> receivers;

    @NotNull
    @OneToOne
    private User sender;

    // and so on
}

Соответствующая таблица 'privateMessage' не будет сгенерирована, и удовлетворены только отношения между PM и многими получателями. Я запутался в этом. Каждый раз, когда я пытаюсь установить атрибут 'mappedBy', моя IDE помечает его как ошибку.

Кажется, проблема в том, что пользовательский объект не знает о личном сообщении, которое его отображает.

Что я здесь не так делаю? Я решил некоторую ситуацию, похожую на эту, но ни одно из этих решений не сработает.

Заранее спасибо!

1 ответ

Решение

Теперь я знаю ответ на мои проблемы:

Поле 'read' является зарезервированным ключевым словом MySQL: http://dev.mysql.com/doc/refman/5.5/en/reserved-words.html

Поэтому я изменил поле на непрочитанное, и теперь таблица успешно сгенерирована.

Кроме того, я думаю, что правильным сопоставлением от PrivateMessage для пользователя является @ManyToMany, потому что в PM может быть несколько пользователей, а также пользователи могут получать несколько PM. Поле "Отправитель" остается @OneToOne.

Теперь все таблицы созданы успешно. Основная проблема заключалась в том, что я использовал зарезервированное ключевое слово MySQL, что препятствовало генерации таблицы. Когда эта проблема была решена, было легко определить правильную конфигурацию отображений.

Другие вопросы по тегам