2013-08-04 34 views
17

Tôi thực sự mới dùng chế độ ngủ đông và cố gắng thiết lập 2 lớp. Tài khoản và cá nhân. Bây giờ tất cả những gì tôi cố gắng làm là tạo một phụ thuộc hai chiều bằng cách sử dụng chú thích. Dưới đây là một số chi tiết và đoạn mã:Không thể tạo hàm tạo cho org.hibernate.persister.entity.SingleTableEntityPersister

Dưới đây là thư viện của tôi mà tôi thêm vào đường dẫn xây dựng, có lẽ tôi bỏ lỡ bất cứ điều gì:

http://prntscr.com/1jbew4

tài khoản:

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

Person:

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> 

Và đây là vấn đề của tôi. khi tôi cố gắng để bắt đầu một lớp học chính đơn giản tạo ra một số đối tượng và lưu chúng, chỉ để kiểm tra, tôi nhận được điều này:

(%%%% Error Creating SessionFactory %%%% = result of try-catch của tôi trước 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) 

Vì vậy, tôi thực sự không biết cách xử lý ngoại lệ này. Tôi đã cố gắng để google nó và như vậy nhưng tất cả tôi phát hiện ra là một số người đã có lỗi chính tả trong mã của họ và đây là lý do cho nó. nhưng tiếc là tôi không có spellies trong mã của tôi. Ai đó có thể giúp tôi? Tôi sẽ rất vui khi đăng bài SessionFactoryCode của tôi hoặc lớp chính nếu cần thiết. Do thực tế rằng tôi mới đến hibernate tôi mất mọi tư vấn =)

BTW: SQL DB đang chạy qua XAMPP.

Cảm ơn.

+1

+1 để cung cấp đủ thông tin để có thể giúp bạn :) – Augusto

+0

Bạn nên chấp nhận câu trả lời viết! Rõ ràng cả hai câu trả lời đều giải quyết được vấn đề. –

Trả lời

36

Bạn đang thiếu setter cho salt tài sản như đã nêu bởi ngoại trừ

Vui lòng thêm setter như

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

bạn đã đúng thiết lập tiêu chuẩn của muối đã mất tích. cảm ơn bạn rất nhiều !!! đặc biệt là thời gian phản hồi =) bạn đã làm cho ngày của tôi – Stephen

15

Nếu bạn nhìn vào chuỗi các trường hợp ngoại lệ, vấn đề là

Gây ra bởi: org.hibernate.PropertyNotFoundException: Không thể tìm thấy một setter cho muối thuộc tính trong lớp backend.Account

Vấn đề là phương thức Account.setSalt() hoạt động tốt khi bạn tạo một cá thể chứ không phải khi bạn lấy một cá thể từ cơ sở dữ liệu. Điều này là do bạn không muốn tạo ra một muối mới mỗi khi bạn tải một tài khoản.

Để khắc phục điều này, hãy tạo phương thức setSalt (dài) với chế độ hiển thị riêng tư và Hibernate sẽ có thể đặt giá trị (chỉ cần ghi chú, tôi nghĩ nó hoạt động với Riêng tư, nhưng bạn có thể cần phải gói hoặc bảo vệ) .

Các vấn đề liên quan