0

クラス Person とクラス Role があります。Person と Role の間には多対多の双方向の関係があります。新しい Person を作成し、既存のロールを db からロードして、そのロールを Person に設定すると、機能します。しかし、既存の Person を db からロードした場合 (すでにいくつかのロールがあります)、db から別のロールをロードし、そのロールをその人に設定すると、org.hibernate.NonUniqueObjectException が発生します。同じ識別子の値を持つ別のオブジェクトが既にセッションに関連付けられていました:役割。

どこに問題があるのか​​わからない。

私のhbm.xmlがあります

<class name="Person" table="person">
  <id column="ID" name="id" type="java.lang.Integer">
    <generator class="native"/>
  </id>
  <property column="Name" name="name" type="string"/>
  <property column="Surname" name="surname" type="string"/>
 <property column="Email" name="email" type="string"/>    
 <set  name="roles" table="role_person" inverse="false" lazy="true" fetch="select" cascade="all">
    <key column="Person_ID"/>
    <many-to-many class="Role" column="Role_ID"/>
 </set>
</class>

<class name="Role" table="role">
  <id column="ID" name="id" type="java.lang.Integer">
    <generator class="native"/>
  </id>
  <property column="Name" name="name" type="string"/> 
  <set name="people" table="role_person" inverse="true" lazy="true" fetch="select">
    <key column="Person_ID"/>
    <many-to-many class="Role" column="Role_ID"/>
  </set>
 </class>

私のコード:

Person person1 = LoadObjects.getPerson( with some ID); // this person has already role author
Person person2 = LoadObjects.getPerson( with another ID); // this person has already role owner 

Role roleOwner = LoadObjects.getOwnerRole();
Role roleAuthor = LoadObjects.getAuthorRole();

// この条件は適切に機能しません。たとえそうであってはならない場合でも常に true ですが、この例では true のはずです

if (!person1.getRoles().contains(roleOwner)) {
        person1.getRoles().add(roleOwner);
}
if (!person2.getRoles().contains(roleAuthor)) {
        person2.getRoles().add(roleAuthor);
}

SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session session = sessionFactory.openSession();
session.beginTransaction();

session.saveOrUpdate(person1);
session.saveOrUpdate(person2);

session.getTransaction().commit();
session.close();

getOwnerRole メソッドがあります:

 public static Role getOwnerRole() {
    Session s = sessionFactory.openSession();
    s.beginTransaction();
    List a = s.createQuery("from Role where name = 'Owner'").list();
    Role role = (Role) a.get(0);
    Hibernate.initialize(role.getPeople());
    s.close();
    return (Role) a.get(0);
 }
4

1 に答える 1

0

HBM マッピングでエラーが発生しました。それは問題の原因ではないと考えました。

<class name="Person" table="person">
  <id column="ID" name="id" type="java.lang.Integer">
    <generator class="native"/>
  </id>
  <property column="Name" name="name" type="string"/>
  <property column="Surname" name="surname" type="string"/>
 <property column="Email" name="email" type="string"/>    
 <set  name="roles" table="role_person" inverse="false" lazy="true" fetch="select" cascade="all">
    <key column="Person_ID"/> // This Should be ID As person id column name is ID..
    <many-to-many class="Role" column="Role_ID"/>// This Should be ID As well as ROLE id column name is ID..
 </set>
</class>

<class name="Role" table="role">
  <id column="ID" name="id" type="java.lang.Integer">
    <generator class="native"/>
  </id>
  <property column="Name" name="name" type="string"/> 
  <set name="people" table="role_person" inverse="true" lazy="true" fetch="select">
    <key column="Person_ID"/>// This Should be ID As ROLE id column name is ID..
    <many-to-many class="Role" column="Role_ID"/>// This Should be ID As well, as People  id column name is ID..
  </set>
 </class>
于 2013-04-25T15:10:59.037 に答える