2013-06-26 4 views
0

При попытке запустить следующую программу:Почему я получаю org.hibernate.PropertyAccessException?

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();   
    } 
} 

Я получаю:

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 many между Person и Address классом.

отображение XML:

<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> 

POJO:

Person

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; 
    } 
} 

Адрес

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, который создал таблицу

CREATE TABLE person(p_id INTEGER,p_name TEXT,PRIMARY KEY(p_id)); 
CREATE TABLE address(a_id INTEGER,p_address TEXT); 

ответ

1

В вашем примере вы добавляете к адресу набор строк. Но в конфигурации вы указываете адрес class.So Я думаю, что ваши проблемы в этой линии:

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

Вы должны изменить набор для Set<Address> и добавлять объекты Адрес в комплекте:

Set<Address> set = new HashSet<>(); 
Address address = new Address(); 
address.setPersonAddress("Address-1"); 
set.add(address); 
+0

okay..Then может быть я мои концепции ошибочны. Пожалуйста, объясните мне тег 'set' внутри класса' person'. –

+0

@SuhailGupta, я думаю, 'set' пишет правильно. Но если бы я был вами, я бы использовал дженерики, чтобы избежать некоторых проблем во время работы с человеком. –

+0

мы можем обсудить здесь @ http://chat.stackoverflow.com/rooms/32377/discussion-between-suhail-and-aleksei-bulgak –

0

Вы можете сделать пару вещей без сопоставления xml-файла. Поместите @Embeddable на уры Pojo из

@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; 
    } 
} 

Тогда на

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 отображения файла