Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > many-to-many Hibernate


Автор: Altern 5.5.2008, 23:07
Всем привет.

Есть проблема связанная со Spring + Hibernate. Наверняка кто-то сталкивался с ней.

Есть many-to-many связь между двумя таблицами: User и соответственно Restriction. Из формы редактирования Restriction с мультиселектом юзеров всё отлично сохраняется. А вот наоборот - никак. То есть из формы редактирования User с мультиселектом рестрикшнов не сохраняется ничего. Exception такой:

Код

org.hibernate.PropertyAccessException: could not get a field value by reflection getter of com.cgu.searcher.bean.Restriction.id


Many-to-many прописана в конфигурационных файлах хибернейта так:

---Restriction.hbm.xml ---

Код

<hibernate-mapping>
    <class table="RESTRICTION" name="com.cgu.searcher.bean.Restriction">
        <id access="field" name="id">
            <generator class="native"/>
        </id>
        ...
        <set name="users" table="USER_IN_RESTRICTION" cascade="save-update" lazy="true">
            <key column="RESTRICTION_ID"/>
            <many-to-many column="USER_ID"
                class="com.cgu.searcher.bean.User"/>
        </set>
        ...
    </class>
</hibernate-mapping>


---User.hbm.xml ---

Код

<hibernate-mapping>
    <class table="USER" name="com.cgu.searcher.bean.User">
        <id access="field" name="id">
            <generator class="native"/>
        </id>
        ...
        <set name="restrictions" table="USER_IN_RESTRICTION" cascade="save-update" inverse="true" lazy="true">
            <key column="USER_ID"/>
            <many-to-many column="RESTRICTION_ID"
                class="com.cgu.searcher.bean.Restriction"/>
        </set>
        ...
    </class>
</hibernate-mapping>


Бины такие:

User:

Код

public class User extends BaseEntity {
    ...

    private Set<Restriction> restrictions;

    ...
 
    public Set<Restriction> getRestrictions() {
        return this.restrictions;
    }

    public void setRestrictions(Set<Restriction> restrictions) {
        this.restrictions = restrictions;
    }

    ...

}


Restriction:

Код

public class Restriction extends BaseEntity {
    
    ...
    
    private Set<User> users;
    
    ...

    public Set<User> getUsers() {
        return users;
    }

    public void setUsers(Set<User> users) {
        this.users = users;
    }

    ...
}


BaseEntity:

Код

public class BaseEntity {

    private Integer id;

    public BaseEntity() {
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer integer) {
        id = integer;
    }
}



Что неправильно? Заранее спасибо

Автор: Kangaroo 5.5.2008, 23:22
Может все из-за этого:
Цитата(Altern @  5.5.2008,  23:07 Найти цитируемый пост)
inverse="true"


Хотя ошибка левая какая-то..

http://simoes.org/docs/hibernate-2.1/155.html

Автор: Altern 6.5.2008, 12:17
без inverse тоже не работает

Автор: Altern 6.5.2008, 13:26
проблема решена

Загвоздка была в способе сохранения entity. Раньше было:

Код

getHibernateTemplate().merge(entity);


стало:

Код

 getSession().flush();
 getSession().saveOrUpdate(entity);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)