【问题标题】:many-to-many hibernate with AutoPopulatingList incurred a PropertyAccessException使用 AutoPopulatingList 的多对多休眠导致 PropertyAccessException
【发布时间】:2011-07-28 13:02:52
【问题描述】:

我遇到了这个问题,它在尝试 saveOrUpdate(); 时总是遇到 PropertyAccessException;我正在使用 Spring 3 和带有 tomcat 7 的休眠 3.6。

我有一个给 Pemilik 的 M-M Akte

代码如下:(简单属性省略)

public class Akte implements Serializable, Comparable {
    private Long id;
    private int version;

    AutoPopulatingList pemiliks; 

    public Akte() {
    }


    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public int getVersion() {
        return version;
    }

    public void setVersion(int version) {
        this.version = version;
    }


    public AutoPopulatingList getPemiliks() {
        return pemiliks;
    }

    public void setPemiliks(AutoPopulatingList pemiliks) {
        this.pemiliks = pemiliks;
    }

}

public class Pemilik implements Serializable {
    private Long id;
    private int version;
    private Set aktes = new HashSet();

    public Pemilik() {}

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public int getVersion() {
        return version;
    }

    public void setVersion(int version) {
        this.version = version;
    }

    public Set getAktes() {
        return aktes;
    }

    public void setAktes(Set aktes) {
        this.aktes = aktes;
    }

}

这里是映射文件

<hibernate-mapping package="com.notaris.beans">

    <class name="Akte" table="AKTE" dynamic-insert="true" dynamic-update="true" lazy="true">


        <id name="id" column="AKTE_ID">

            <generator class="native"/>

        </id>

        <version name="version" column="VERSION"/>

        <bag name="pemiliks" table="AKTE_PEMILIK" lazy="true" cascade="save-update">
           <key column="AKTE_ID"/>
           <many-to-many class="Pemilik" column="PEMILIK_ID"/>
        </bag>


    </class>
</hibernate-mapping>


<hibernate-mapping package="com.notaris.beans">
    <class name="Pemilik" table="PEMILIK" lazy="true">
        <id name="id" column="PEMILIK_ID">
           <generator class="native"/>
        </id>
        <version name="version" column="VERSION"/>
        <set name="aktes" table="AKTE_PEMILIK" lazy="true" inverse="true" cascade="save-update">
            <key column="PEMILIK_ID"/>
            <many-to-many class="Akte" column="AKTE_ID"/>
        </set>
    </class>
</hibernate-mapping>

现在我试图在 processFinish() 期间保存它

通过执行以下操作: akteService.createAkte(cmd.getAkte()); 在 Akte 内部有一个包含 Pemilik 对象的 AutoPopulatingList。 并且 AutoPopulatingList 以简单的方式启动 new AutoPopulatingList(Pemilik.class);

这是堆栈跟踪

org.hibernate.PropertyAccessException: IllegalArgumentException 在调用 com.notaris.beans.Akte.pemiliks 的设置器时发生 org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:128) org.hibernate.tuple.entity.AbstractEntityTuplizer.setPropertyValues(AbstractEntityTuplizer.java:583) org.hibernate.tuple.entity.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:229) org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.java:3822) org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:299) org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:203) org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:129) org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210) org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195) org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:117) org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93) org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:685) org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:677) org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:673) org.springframework.orm.hibernate3.HibernateTemplate$16.doInHibernate(HibernateTemplate.java:740) org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406) org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374) org.springframework.orm.hibernate3.HibernateTemplate.saveOrUpdate(HibernateTemplate.java:737) com.notaris.dao.AkteDaoImpl.createAkte(AkteDaoImpl.java:26) com.notaris.service.AkteService.createAkte(AkteService.java:22) com.notaris.controller.AddAkteController.processFinish(AddAkteController.java:228) org.springframework.web.servlet.mvc.AbstractWizardFormController.validatePagesAndFinish(AbstractWizardFormController.java:650) org.springframework.web.servlet.mvc.AbstractWizardFormController.processFormSubmission(AbstractWizardFormController.java:500) org.springframework.web.servlet.mvc.AbstractFormController.handleRequestInternal(AbstractFormController.java:268) org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:153) org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644) org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560) javax.servlet.http.HttpServlet.service(HttpServlet.java:641) javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

有什么想法吗? 我看了一下 pemiliks 属性,它只是一个简单的 AutoPopulatingList,我没有 了解 setter 无法访问它的问题是什么? 谢谢。

【问题讨论】:

  • 为什么不使用注释?

标签: hibernate spring


【解决方案1】:

需要hibernate管理的集合类型应该是java.util.Set或者List。该错误很可能是由于 pemiliks 属于 AutoPopulatingList 类型,请将其更改为 List(也是 setter 和 getter)。您可以将集合初始化为 AutoPopulatingList 的一个实例。

【讨论】:

  • 谢谢。有用。该死的我应该注意到它,即使设置是使用 Set set = new HashSet();程序到接口而不是具体的实现口头禅。叹息 ;)
  • 太棒了! - 请您将此标记为已回答/正确答案吗?
猜你喜欢
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-28
相关资源
最近更新 更多