19

データベースに次のテーブルがあります。

Announcements:
- AnnouncementID (PK)
- Title

AnouncementsRead (composite PK on AnnouncementID and UserID):
- AnnouncementID (PK)
- UserID (PK)
- DateRead

Users:
- UserID (PK)
- UserName

通常、多対多の関係を使用して「AnnouncementsRead」をマップしますが、このテーブルには追加の「DateRead」フィールドもあります。

これまでのところ、次のエンティティを定義しました。

    public class Announcement
    {
        public virtual int AnnouncementID { get; set; }
        public virtual string Title { get; set; }
        public virtual IList<AnnouncementRead> AnnouncementsRead { get; private set; }

        public Announcement()
        {
            AnnouncementsRead = new List<AnnouncementRead>();
        }
    }

    public class AnnouncementRead
    {
        public virtual Announcement Announcement { get; set; }
        public virtual User User { get; set; }
        public virtual DateTime DateRead { get; set; }
    }

    public class User
    {
        public virtual int UserID { get; set; }
        public virtual string UserName { get; set; }
        public virtual IList<AnnouncementRead> AnnouncementsRead { get; private set; }

        public User()
        {
            AnnouncementsRead = new List<AnnouncementRead>();
        }
 }

次のマッピングを使用します。

public class AnnouncementMap : ClassMap<Announcement>
{
    public AnnouncementMap()
    {
        Table("Announcements");
        Id(x => x.AnnouncementID);
        Map(x => x.Title);
        HasMany(x => x.AnnouncementsRead)
            .Cascade.All();
    }
}

public class AnnouncementReadMap : ClassMap<AnnouncementRead>
{
    public AnnouncementReadMap()
    {
        Table("AnnouncementsRead");
        CompositeId()
            .KeyReference(x => x.Announcement, "AnnouncementID")
            .KeyReference(x => x.User, "UserID");
        Map(x => x.DateRead);
    }
}

public class UserMap : ClassMap<User>
{
    public UserMap()
    {
        Table("Users");
        Id(x => x.UserID);
        Map(x => x.UserName);
        HasMany(x => x.AnnouncementsRead)
            .Cascade.All();
    }
}

ただし、これを実行すると、次のエラーが表示されます。

"composite-id class must override Equals(): Entities.AnnouncementRead"

誰かが私を正しい方向に向けることができれば幸いです。ありがとう

4

2 に答える 2

9

NHibernate の指示どおりに実行する必要があります。およびメソッドAnnouncementReadをオーバーライドする必要があります。主キーの一部であるフィールドに基づく必要がありますEqualsGetHashCode

于 2010-08-09T11:02:47.550 に答える
1
  1. equals を実装するときは、サブクラスとの比較を可能にするためにinstanceof を使用する必要があります。Hibernate が 1 対 1 または多対 1 のリレーションを遅延ロードする場合、プレーン クラスの代わりにクラスのプロキシを使用します。プロキシはサブクラスです。クラス名の比較は失敗します。
    より技術的には、Liskows Substitution Principle に従い、対称性を無視する必要があります。
  2. 次の落とし穴は、 name.equals(that.getName())の代わりにname.equals (that.name)のようなものを使用することです。それがプロキシの場合、最初のものは失敗します。

http://www.laliluna.de/jpa-hibernate-guide/ch06s06.html

于 2013-01-18T16:19:32.857 に答える