I am actually new to hibernate and tried to set up 2 classes. Account and Person. Now all i try to do is create a one to one bidirectional dependency using annotations. Here are some details and code snippets:
Here are my libraries which i added to the build path, maybe i missed anything:
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) {
}
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>
And here is my problem. when i try to start a simple main class creating some objects and saving them, just to test, i get this:
( %%%% Error Creating SessionFactory %%%% = result of my 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)
So i really dont know how to handle this exception. I tried to google it and such but all i found out is that some people had spelling mistakes in their code and this was the reason for it. but unfortunately i dont have spellies in my code. Can someone help me? I will be happy to also post my SessionFactoryCode or the main class if neccessary. Due to the fact that i am new to hibernate i take every advise =)
BTW: SQL DB is running via XAMPP.
Thanks.
I encountered this error when upgrading from jdk10 to jdk11. Adding the following dependency fixed the problem:
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.25.0-GA</version>
</dependency>
You are missing setter for salt
property as indicated by the exception
Please add the setter as
public void setSalt(long salt) {
this.salt=salt;
}
If you look at the chain of exceptions, the problem is
Caused by: org.hibernate.PropertyNotFoundException: Could not find a setter for property salt in class backend.Account
The problem is that the method Account.setSalt() works fine when you create an instance but not when you retrieve an instance from the database. This is because you don't want to create a new salt each time you load an Account.
To fix this, create a method setSalt(long) with visibility private and Hibernate will be able to set the value (just a note, I think it works with Private, but you might need to make it package or protected).
I think the root cause here is as follows:
org.hibernate.HibernateException: Unable to instantiate default tuplizer [org.hibernate.tuple.entity.PojoEntityTuplizer]
so solution is
For Java 8/11 support, you need to upgrade to Hibernate 5.4 OR Add javaassist 3.20.0 jar file into your classpath. use only this version of jar file else problem will persist. you can find this jar here - https://jar-download.com/artifacts/org.javassist/javassist/3.20.0-GA/source-code
Thanks!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With