2013-08-04 10 views
17

Jestem nowicjuszem w hibernacji i próbowałem skonfigurować 2 klasy. Konto i osoba. Teraz wszystko, co staram się zrobić, to stworzyć dwukierunkową zależność za pomocą adnotacji. Oto kilka szczegółów i fragmenty kodu:Nie można uzyskać konstruktora dla org.hibernate.persister.entity.SingleTableEntityPersister

Oto moje biblioteki, które dodałem do ścieżki budowania, może brakowało mi coś:

http://prntscr.com/1jbew4

konta:

package backend; 

import java.util.Random; 
import java.util.Collection; 
import java.util.TreeSet; 
import javax.persistence.*; 

@Entity 
@Table(name = "Account") 
public class Account { 

    public static Random rnd = new Random(); 
    private int id; 
    private String username; 
    private long password; 
    private long salt; 
    private Person person; 
    private String role; 
    private Collection<Account> friendlist; 

    public Account() { 

    } 

    public Account(String username, long password, Person person, String role) { 
     super(); 
     this.username = username; 
     this.password = password; 
     this.setSalt(); 
     this.person = person; 
     this.role = role; 
     this.friendlist = new TreeSet<Account>(); 
    } 

    @Id 
    @GeneratedValue 
    @Column(name = "Id") 
    public int getId() { 
     return id; 
    } 

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

    @Column(name = "Username") 
    public String getUsername() { 
     return username; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 

    @Column(name = "Password") 
    public long getPassword() { 
     return password; 
    } 

    public void setPassword(String password) { 
     this.password = (long) salt + password.hashCode(); 
    } 

    @Column(name = "Salt") 
    public long getSalt() { 
     return salt; 
    } 

    public void setSalt() { 
     this.salt = rnd.nextLong(); 
     if (this.salt < 0) { 
      this.salt = this.salt * (-1); 
     } 
    } 

    @OneToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "Person_FK") 
    public Person getPerson() { 
     return person; 
    } 

    public void setPerson(Person person) { 
     this.person = person; 
    } 

    @Column(name = "Role") 
    public String getRole() { 
     return role; 
    } 

    public void setRole(String role) { 
} 

Osoba:

package backend; 

import javax.persistence.*; 

@Entity 
@Table(name ="Person") 
public class Person { 

    private int id; 
    private String firstName; 
    private String lastName; 
    private String street; 
    private int houseNumber; 
    private String tel; 
    private String email; 
    private String mobile; 
    private Account account; 

    public Person() { 

    } 

    public Person(int id, String firstName, String lastName, String street, 
      int houseNumber, String tel, String email, String mobile, 
      Account account) { 
     super(); 
     this.id= id; 
     this.firstName = firstName; 
     this.lastName = lastName; 
     this.street = street; 
     this.houseNumber = houseNumber; 
     this.tel = tel; 
     this.email = email; 
     this.mobile = mobile; 
     this.account = account; 
    } 

    @Id 
    @GeneratedValue 
    @Column(name="Id") 
    public int getId() { 
     return id; 
    } 

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

    @Column(name="Firstname") 
    public String getFirstName() { 
     return firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 


    @Column(name="Lastname") 
    public String getLastName() { 
     return lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    @Column(name="Street") 
    public String getStreet() { 
     return street; 
    } 

    public void setStreet(String street) { 
     this.street = street; 
    } 

    @Column(name="Housenumber") 
    public int getHouseNumber() { 
     return houseNumber; 
    } 

    public void setHouseNumber(int houseNumber) { 
     this.houseNumber = houseNumber; 
    } 

    @Column(name="Tel") 
    public String getTel() { 
     return tel; 
    } 

    public void setTel(String tel) { 
     this.tel = tel; 
    } 

    @Column(name="Email") 
    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

    @Column(name="Mobile") 
    public String getMobile() { 
     return mobile; 
    } 

    public void setMobile(String mobile) { 
     this.mobile = mobile; 
    } 

    @OneToOne(mappedBy = "person", cascade = CascadeType.ALL) 
    public Account getAccount() { 
     return account; 
    } 

    public void setAccount(Account account) { 
     this.account = account; 
    } 
} 

Hibernate cfg xml:

<?xml version='1.0' encoding='utf-8'?> 
<!DOCTYPE hibernate-configuration PUBLIC 
     "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
     "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
    <session-factory> 
     <!-- Alternative 1: MySQL --> 

     <!-- Database connection settings: MySQL --> 
     <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 
     <property name="connection.url">jdbc:mysql:///chat.application.db</property> 
     <property name="connection.username">root</property> 
     <property name="connection.password"></property> 
     <property name="dialect">org.hibernate.dialect.MySQLDialect</property> 


     <!-- JDBC connection pool (use the built-in) --> 
     <property name="connection.pool_size">1</property> 


     <!-- Enable Hibernate's automatic session context management --> 
     <property name="current_session_context_class">thread</property> 

     <!-- Disable the second-level cache --> 
     <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> 

     <!-- Echo all executed SQL to stdout --> 
     <property name="show_sql">true</property> 
     <property name="format_sql">true</property> 

     <!-- Drop and re-create the database schema on startup --> 
     <property name="hbm2ddl.auto">create</property> 

     <property name="hibernate.format_sql">true</property> 

     <!-- Auflistung der gemappten Klassen (Package + Class-Name) --> 
     <mapping class="backend.Account"/> 
     <mapping class="backend.Person"/> 

     <!-- <mapping class="backend.Role"/> --> 
    </session-factory> 
</hibernate-configuration> 

I tu jest mój problem. kiedy próbuję uruchomić prostą główną klasę, tworząc pewne obiekty i zapisując je, aby przetestować, otrzymuję:

(%%%% Błąd podczas tworzenia SessionFactory %%%% = wynik mojego try-catch before printStackTrace)

INFO: HHH000397: Using ASTQueryTranslatorFactory 
%%%% Error Creating SessionFactory %%%% 
org.hibernate.MappingException: Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister 
    at org.hibernate.persister.internal.PersisterFactoryImpl.create(PersisterFactoryImpl.java:185) 
    at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:135) 
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:385) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1769) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1840) 
    at backend.HibernateSessionFactory.currentSession(HibernateSessionFactory.java:21) 
    at backend.HibernateSessionFactory.getCfg(HibernateSessionFactory.java:48) 
    at backend.Main.main(Main.java:14) 
Caused by: org.hibernate.HibernateException: Unable to instantiate default tuplizer [org.hibernate.tuple.entity.PojoEntityTuplizer] 
    at org.hibernate.tuple.entity.EntityTuplizerFactory.constructTuplizer(EntityTuplizerFactory.java:138) 
    at org.hibernate.tuple.entity.EntityTuplizerFactory.constructDefaultTuplizer(EntityTuplizerFactory.java:188) 
    at org.hibernate.tuple.entity.EntityMetamodel.<init>(EntityMetamodel.java:341) 
    at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:507) 
    at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:146) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
    at java.lang.reflect.Constructor.newInstance(Unknown Source) 
    at org.hibernate.persister.internal.PersisterFactoryImpl.create(PersisterFactoryImpl.java:163) 
    ... 7 more 
Caused by: java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
    at java.lang.reflect.Constructor.newInstance(Unknown Source) 
    at org.hibernate.tuple.entity.EntityTuplizerFactory.constructTuplizer(EntityTuplizerFactory.java:135) 
    ... 16 more 
Caused by: org.hibernate.PropertyNotFoundException: Could not find a setter for property salt in class backend.Account 
    at org.hibernate.property.BasicPropertyAccessor.createSetter(BasicPropertyAccessor.java:252) 
    at org.hibernate.property.BasicPropertyAccessor.getSetter(BasicPropertyAccessor.java:245) 
    at org.hibernate.mapping.Property.getSetter(Property.java:326) 
    at org.hibernate.tuple.entity.PojoEntityTuplizer.buildPropertySetter(PojoEntityTuplizer.java:444) 
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.<init>(AbstractEntityTuplizer.java:201) 
    at org.hibernate.tuple.entity.PojoEntityTuplizer.<init>(PojoEntityTuplizer.java:82) 
    ... 21 more 
Exception in thread "main" java.lang.NullPointerException 
    at backend.HibernateSessionFactory.currentSession(HibernateSessionFactory.java:28) 
    at backend.HibernateSessionFactory.getCfg(HibernateSessionFactory.java:48) 
    at backend.Main.main(Main.java:14) 

więc naprawdę nie wiem, jak obsługiwać ten wyjątek. Próbowałem google i takie, ale wszystkie dowiedziałem się, że niektórzy ludzie pisowni błędów w swoim kodzie i to było tego powodem. ale niestety nie mam zaklęć w moim kodzie. Czy ktoś może mi pomóc? Z chęcią opublikuję również mój SessionFactoryCode lub główną klasę, jeśli będzie to konieczne. Ze względu na to, że jestem nowy w hibernacji, przyjmuję wszelkie porady =)

BTW: SQL DB działa poprzez XAMPP.

Dzięki.

+1

+1 za udzielenie wystarczającej ilości informacji, aby móc Ci pomóc :) – Augusto

+0

Powinieneś zaakceptować odpowiedź na piśmie! Najwyraźniej obie odpowiedzi rozwiązują problem. –

Odpowiedz

36

Brakuje setter dla salt nieruchomości wskazanych przez wyjątkiem

proszę dodać setter jak

public void setSalt(long salt) { 
     this.salt=salt; 
} 
+0

Masz rację, nie ma standardowego ustawiacza soli. Dziękuję bardzo !!! szczególnie dla czasu reakcji =) zrobiliście mój dzień – Stephen

15

Jeśli spojrzeć na łańcuchu wyjątkami, problem jest

Spowodowane przez: org.hibernate.PropertyNotFoundException: Nie można znaleźć setera dla właściwości soli w backend klas. Liczba

Problem polega na tym, że metoda Account.setSalt() działa poprawnie podczas tworzenia instancji, ale nie podczas pobierania instancji z bazy danych. Dzieje się tak, ponieważ nie chcesz tworzyć nowej soli za każdym razem, gdy ładujesz Konto.

Aby to naprawić, utwórz metodę setSalt (long) z visibility private, a Hibernate będzie w stanie ustawić wartość (tylko uwaga, myślę, że działa z Private, ale być może będziesz musiał zrobić pakiet lub ochronić) .

Powiązane problemy