2013-08-04 11 views
17

In realtà sono nuovo di ibernazione e ho provato a impostare 2 classi. Conto e persona Ora tutto quello che cerco di fare è creare una dipendenza bidirezionale usando le annotazioni. Qui ci sono alcuni dettagli e frammenti di codice:Impossibile ottenere il costruttore per org.hibernate.persister.entity.SingleTableEntityPersister

Ecco le mie librerie che ho aggiunto al percorso di generazione, forse ho perso qualcosa:

http://prntscr.com/1jbew4

Account:

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) { 
} 

Persona:

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> 

E qui è il mio problema. quando provo ad avviare una semplice classe principale creando alcuni oggetti e salvandoli, solo per testare, ottengo questo:

(%%%% Errore nella creazione di SessionFactory %%%% = risultato del mio try-catch prima di 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) 

così io non so davvero come gestire questa eccezione. Ho provato a google e così, ma tutto quello che ho scoperto è che alcune persone avevano errori di ortografia nel loro codice e questa era la ragione per questo. ma sfortunatamente non ho spellie nel mio codice. Qualcuno può aiutarmi? Sarò felice di pubblicare anche il mio SessionFactoryCode o la classe principale, se necessario. A causa del fatto che sono nuovo di ibernare prendo ogni consiglio =)

BTW: il DB SQL è in esecuzione tramite XAMPP.

Grazie.

+1

+1 per fornire informazioni sufficienti per essere in grado di aiutarti :) – Augusto

+0

Devi accettare la risposta in scrittura! Apparentemente entrambe le risposte risolvono il problema. –

risposta

36

Ti manca setter per salt proprietà come indicato dalla deroga

Si prega di aggiungere il setter come

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

avevi ragione mancava il setter standard di sale. grazie mille !!! soprattutto per il tempo di risposta =) hai reso la mia giornata – Stephen

15

Se si guarda la catena di eccezioni, il problema è

Causato da: org.hibernate.PropertyNotFoundException: Impossibile trovare un setter per la proprietà salt nel backend di classe. Account

Il problema è che il metodo Account.setSalt() funziona correttamente quando si crea un'istanza ma non quando si recupera un'istanza dal database. Questo perché non vuoi creare un nuovo salt ogni volta che carichi un Account.

Per risolvere questo problema, creare un metodo setSalt (long) con visibilità private e Hibernate sarà in grado di impostare il valore (solo una nota, penso che funzioni con Private, ma potrebbe essere necessario renderlo pacchetto o protetto) .

Problemi correlati