我实际上是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之前我的try-catch的结果)
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的新手,我会采取一切建议=)
BTW:SQL DB正在通过XAMPP运行。
感谢。
答案 0 :(得分:42)
您缺少salt
属性的setter,如异常
请将设置器添加为
public void setSalt(long salt) {
this.salt=salt;
}
答案 1 :(得分:19)
如果你看一下例外链,问题是
引起:org.hibernate.PropertyNotFoundException:无法在类backend.Account中找到属性salt的setter
问题是Account.setSalt()方法在创建实例时工作正常,但在从数据库中检索实例时却不能正常工作。这是因为您不希望每次加载帐户时都创建新的盐。
要解决此问题,请创建一个方法setSalt(long),其中可见性为private,而Hibernate将能够设置该值(只是一个注释,我认为它适用于Private,但您可能需要将其设置为包或受保护)。
答案 2 :(得分:1)
从jdk10升级到jdk11时遇到此错误。添加以下依赖项可以解决此问题:
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.25.0-GA</version>
</dependency>
答案 3 :(得分:1)
检查以下情况
答案 4 :(得分:0)
在我的情况下,问题是由于Jars冲突造成的。
这是罐子的完整列表,对我来说绝对不错。
antlr-2.7.7.jar
byte-buddy-1.8.12.jar
c3p0-0.9.5.2.jar
classmate-1.3.4.jar
dom4j-1.6.1.jar
geolatte-geom-1.3.0.jar
hibernate-c3p0-5.3.1.Final.jar
hibernate-commons-annotations-5.0.3.Final.jar
hibernate-core-5.3.1.Final.jar
hibernate-envers-5.3.1.Final.jar
hibernate-jpamodelgen-5.3.1.Final.jar
hibernate-osgi-5.3.1.Final.jar
hibernate-proxool-5.3.1.Final.jar
hibernate-spatial-5.3.1.Final.jar
jandex-2.0.3.Final.jar
javassist-3.22.0-GA.jar
javax.interceptor-api-1.2.jar
javax.persistence-api-2.2.jar
jboss-logging-3.3.2.Final.jar
jboss-transaction-api_1.2_spec-1.1.1.Final.jar
jts-core-1.14.0.jar
mchange-commons-java-0.2.11.jar
mysql-connector-java-5.1.21.jar
org.osgi.compendium-4.3.1.jar
org.osgi.core-4.3.1.jar
postgresql-42.2.2.jar
proxool-0.8.3.jar
slf4j-api-1.6.1.jar
答案 5 :(得分:0)
在我的情况下,只有通过实现可序列化才能解决问题:
@实体 @Table(name =“ User”,uniqueConstraints = {@UniqueConstraint(columnNames = {“ nam”})}) 公共类用户扩展GenericT实现Serializable
答案 6 :(得分:0)
我通过从springfox中排除字节伙伴依赖性来解决了这个问题
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.7.0</version>
<exclusions>
<exclusion>
<groupId>net.bytebuddy</groupId>
<artifactId>byte-buddy</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.7.0</version>
<exclusions>
<exclusion>
<groupId>net.bytebuddy</groupId>
<artifactId>byte-buddy</artifactId>
</exclusion>
</exclusions>
</dependency>