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


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

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

  • пользователь
  • PrivateMessage
Модель пользователя не должна редактироваться, поэтому я пытаюсь установить однонаправленную связь:
@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' не будет сгенерирована и просто отношения между премьер-министром и многими получателями удовлетворены. Я в замешательстве из-за этого. Каждый раз, когда я пытаюсь установить атрибут mappedBy, моя IDE помечает его как ошибку.

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

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

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

1 2

1 ответ:

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

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

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

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

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