2013-04-25 3 views
0

У меня есть класс Person и class Role. Существует много-много двунаправленных отношений между Лицом и Ролью. Если я создаю нового Person, загрузите существующую роль из db и задайте роль Person, она будет работать. Но если я загружаю существующий Person из db (уже имеет некоторые роли), загрузите еще одну роль из db, задайте роль человеку - я получаю org.hibernate.NonUniqueObjectException, с сеансом уже был связан другой объект с тем же значением идентификатора: Роль.Hibernate - обновляющий объект со многими отношениями

Я не знаю, где проблема.

Существует мой 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(); 

// это условие не работают должным образом, они всегда верны, даже если они не должны, но в этом примере, они должны быть правдой

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); 
} 
+0

Вы можете показать код 'LoadObjects.getOwnerRole();' если вы используете метод 'load' внутри .. попробуйте с' get' –

ответ

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> 
Смежные вопросы