我实际上是hibernate的新手,并且尝试设置了2个类。帐户和人员。现在,我要做的就是使用注释创建一个一对一的双向依赖关系。以下是一些详细信息和代码片段:
下面是我添加到构建路径中的库,也许我遗漏了什么:
帐户:
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) {
}
人员:
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>
这就是我的问题。当我尝试启动一个简单的主类,创建一些对象并保存它们,只是为了测试,我得到了这个:
( %创建SessionFactory时出错%=在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)
所以我真的不知道如何处理这个异常。我试着在谷歌上搜索,但我发现有些人的代码中有拼写错误,这就是原因。但不幸的是,我的代码中没有拼写。有人能帮我吗?如果有必要的话,我也很乐意发布我的SessionFactoryCode或者主类。由于我是hibernate的新手,我采纳了所有建议=)
顺便说一句: SQL DB正在通过XAMPP运行。
谢谢。
发布于 2019-05-14 16:14:38
我在从jdk10升级到jdk11时遇到了这个错误。添加以下依赖项解决了此问题:
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.25.0-GA</version>
</dependency>
发布于 2013-08-04 19:10:04
如异常所示,缺少salt
属性的设置器
请将setter添加为
public void setSalt(long salt) {
this.salt=salt;
}
发布于 2013-08-04 19:11:26
如果您查看异常链,问题是
由: org.hibernate.PropertyNotFoundException:在类backend.Account中找不到属性salt的设置器
问题是,Account.setSalt()方法在创建实例时运行良好,但在从数据库检索实例时就不能正常工作。这是因为您不希望每次加载帐户时都创建新的salt。
为了解决这个问题,创建一个具有私有可见性的方法setSalt(long),Hibernate将能够设置该值(只需注意,我认为它适用于私有,但您可能需要将其打包或保护)。
https://stackoverflow.com/questions/18042247
复制相似问题