2

2人以上のユーザー間のプライベートメッセージのモデルを実装しようとしています。

つまり、2つのエンティティがあります。

  • ユーザー
  • プライベートメッセージ

ユーザーモデルは編集しないでください。そのため、一方向の関係を設定しようとしています。

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

PrivateMessageモデルは複数の受信者をアドレス指定し、送信者は1つだけです。だから私はこのようなものが必要です:

@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はそれをエラーとしてマークします。

ユーザーエンティティがそれをマップするプライベートメッセージを認識していないことが問題のようです。

私はここで何が間違っているのですか?私はこれに似たいくつかの状況を解決しましたが、それらの解決策のどれもここでは機能しません。

前もって感謝します!

4

1 に答える 1

1

私は今、私の問題に対する答えを知っています:

フィールド「読み取り」は、MySQLの予約語です:http: //dev.mysql.com/doc/refman/5.5/en/reserved-words.html

そこで、フィールドを未読に変更すると、テーブルが正常に生成されます。

さらに、PrivateMessageからUserへの正しいマッピングは@ManyToManyだと思います。これは、PMに複数のユーザーがアドレス指定されている可能性があり、ユーザーが複数のPMを受信できるためです。フィールド「sender」は@OneToOneのままです。

これで、すべてのテーブルが正常に生成されました。主な問題は、予約済みのMySQLキーワードを使用したため、テーブルが生成されなかったことです。その問題が解決されたとき、マッピングの正しい構成を理解するのは簡単でした。

于 2012-09-07T09:39:17.663 に答える