Как управлять один-к-одному и один-ко-многим одного и того же типа, как однонаправленное отображение?
Я пытаюсь реализовать модель для личных сообщений между двумя или более пользователями.
Это означает, что у меня есть две сущности:
- пользователь
- 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 ответ:
Теперь я знаю ответ на свои проблемы:
Поле "read" является зарезервированным ключевым словом MySQL: http://dev.mysql.com/doc/refman/5.5/en/reserved-words.html
Поэтому я изменил поле на непрочитанное, и теперь таблица успешно генерируется.
Кроме того, я думаю, что правильное отображение от PrivateMessage к пользователю-это @ManyToMany, потому что в PM может быть несколько пользователей, а также пользователи могут получать несколько PMs. Поле "отправитель" остается @OneToOne.
Теперь все таблицы сгенерированы успешно. Основная проблема заключалась в том, что я использовал зарезервированное MySQL-ключевое слово, и это помешало созданию таблицы. Когда эта проблема была решена, было легко вычислить правильную конфигурацию отображений.