Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister

JavaHibernate

Java Problem Overview


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.

Java Solutions


Solution 1 - Java

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>

Solution 2 - Java

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;
 }

Solution 3 - Java

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).

Solution 4 - Java

I resolved this issue by excluding byte-buddy dependency from 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>

Solution 5 - Java

check the following cases

  • 1 your entity class have default constructor
  • 2 check all the getters and setters method and to string (auto generated)
  • 3 add dependency https://mvnrepository.com/artifact/org.javassist/javassist
  • 4 restart your server
  • 5 try putting wrong pass for database connection and restart your server and then put the correct pass again and restart (not sure but it works for me )

Solution 6 - Java

In my case the problem was because of conflicting Jars.

Here is the full list of jars which is working absolutely fine for me.

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

Solution 7 - Java

in my case, the problem got solved only by implementing serializable as below:

@Entity @Table(name = "User" , uniqueConstraints = { @UniqueConstraint(columnNames = {"nam"}) }) public class User extends GenericT implements Serializable

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionStephenView Question on Stackoverflow
Solution 1 - JavaStephen PaulView Answer on Stackoverflow
Solution 2 - JavaharrybvpView Answer on Stackoverflow
Solution 3 - JavaAugustoView Answer on Stackoverflow
Solution 4 - JavaPraveesh PView Answer on Stackoverflow
Solution 5 - JavaSiddharthaView Answer on Stackoverflow
Solution 6 - JavaVaibhav JainView Answer on Stackoverflow
Solution 7 - JavaMina ShiraliView Answer on Stackoverflow