首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我为什么要得到org.hibernate.PropertyAccessException?

我为什么要得到org.hibernate.PropertyAccessException?
EN

Stack Overflow用户
提问于 2013-06-26 05:17:07
回答 2查看 1K关注 0票数 0

在尝试运行以下程序时:

代码语言:javascript
复制
public class Runner {
    public static void main(String args[]) {
        Configuration config = new Configuration().configure();
        SessionFactory sessFact = config.buildSessionFactory();
        Session sess = sessFact.openSession();
        Transaction trans = sess.beginTransaction();

        Person p = new Person();

        p.setPersonName("Suhail");

        Set<String> set = new HashSet<String>();
        set.add("Address-1");
        set.add("Address-2");
        set.add("Address-3");

        p.setAddressSet(set);

        sess.save(p);
        trans.commit();        
    }
}

我得到了:

代码语言:javascript
复制
SEVERE: IllegalArgumentException in class: pojo.Address, getter method
of property: addressID

Exception in thread "main" org.hibernate.PropertyAccessException: 
IllegalArgumentException occurred calling getter of pojo.Address.addressID

我不知道原因是什么。我正在尝试使one to manyPersonAddress类之间进行关联。

映射xml

代码语言:javascript
复制
<hibernate-mapping>
  <class name="pojo.Person" table="person">
      <id name="personID" column="p_id">
          <generator class="increment" />
      </id>
      <property name="personName" column="p_name" />
      <set name="addressSet" table="address" cascade="all"> 
          <key column="p_id" />
          <one-to-many class="pojo.Address" />
      </set>
  </class>

  <class name="pojo.Address" table="address">
      <id name="addressID" column="a_id">
          <generator class="increment" />
      </id>
      <property name="personAddress" column="p_address" />
  </class>
</hibernate-mapping>

波霍:

人物

代码语言:javascript
复制
public class Person {
    private int personID;
    private String personName;
    private Set addressSet;

    public int getPersonID() {
        return personID;
    }

    public void setPersonID(int personID) {
        this.personID = personID;
    }

    public String getPersonName() {
        return personName;
    }

    public void setPersonName(String personName) {
        this.personName = personName;
    }

    public Set getAddressSet() {
        return addressSet;
    }

    public void setAddressSet(Set addressSet) {
        this.addressSet = addressSet;
    }
}

地址

代码语言:javascript
复制
public class Address {
    private int addressID;
    private String personAddress;

    public int getAddressID() {
        return addressID;
    }

    public void setAddressID(int addressID) {
        this.addressID = addressID;
    }


    public String getPersonAddress() {
        return personAddress;
    }

    public void setPersonAddress(String personAddress) {
        this.personAddress = personAddress;
    }
}

创建表的SQL

代码语言:javascript
复制
CREATE TABLE person(p_id INTEGER,p_name TEXT,PRIMARY KEY(p_id));
CREATE TABLE address(a_id INTEGER,p_address TEXT);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-26 05:25:14

在您的示例中,您将向adress set Strings添加。但是在您的配置中,您指定了Address class.So,我认为您在这一行中的问题是:

代码语言:javascript
复制
Set<String> set = new HashSet<String>();
set.add("Address-1");
set.add("Address-2");
set.add("Address-3");

您需要将set更改为Set<Address>并在set中添加Address对象:

代码语言:javascript
复制
Set<Address> set = new HashSet<>();
Address address = new Address();
address.setPersonAddress("Address-1");
set.add(address);
票数 1
EN

Stack Overflow用户

发布于 2013-06-26 05:32:55

不需要映射xml文件,您就可以做几件事。Place @Embeddable on ur Pojo of

代码语言:javascript
复制
    @Embeddable
    @Entity
    public class Address {
    @Id
    private int addressID;
    private String personAddress;

    public int getAddressID() {
        return addressID;
    }

    public void setAddressID(int addressID) {
        this.addressID = addressID;
    }


    public String getPersonAddress() {
        return personAddress;
    }

    public void setPersonAddress(String personAddress) {
        this.personAddress = personAddress;
    }
}

然后继续

代码语言:javascript
复制
   public class Runner {
    public static void main(String args[]) {
        Configuration config = new Configuration().configure();
        SessionFactory sessFact = config.buildSessionFactory();
        Session sess = sessFact.openSession();
        Transaction trans = sess.beginTransaction();

        Person p = new Person();

        p.setPersonName("Suhail");

        @ElementCollection//To inform hibernate to save this in a seperate table
        Set<String> set = new HashSet<String>();
        set.add("Address-1");
        set.add("Address-2");
        set.add("Address-3");

        p.setAddressSet(set);

        sess.save(p);
        trans.commit();        
    }
}

最好使用注释,这样我们就不用编写.hbm.xml映射文件了

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17312054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档