En fait, je suis un nouveau venu en hibernation et j'ai essayé de créer 2 classes. Compte et personne. Maintenant, tout ce que j'essaie de faire est de créer une dépendance bidirectionnelle un à un en utilisant des annotations. Voici quelques détails et extraits de code:
Voici mes bibliothèques que j'ai ajoutées au chemin de construction, peut-être que j'ai raté quelque chose:
Compte:
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) {
}
La personne:
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>
Et voici mon problème. quand j'essaye de démarrer une classe principale simple en créant des objets et en les enregistrant, juste pour tester, j'obtiens ceci:
(%%%% Erreur lors de la création de la SessionFactory %%%% = résultat de mon essai avant la saisie de 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)
Donc, je ne sais vraiment pas comment gérer cette exception. J'ai essayé de google et tel, mais tout ce que j'ai découvert, c'est que certaines personnes avaient des fautes d'orthographe dans leur code et c'était la raison pour cela. mais malheureusement, je n'ai pas de sortilège dans mon code. Est-ce que quelqu'un peut m'aider? Je serai heureux de poster aussi mon SessionFactoryCode ou la classe principale si nécessaire. En raison du fait que je suis nouveau à hiberner, je prends tous les conseils =)
BTW: SQL DB est en cours d'exécution via XAMPP.
Merci.
Il vous manque le setter pour la propriété salt
comme indiqué par l'exception
S'il vous plaît ajouter le setter comme
public void setSalt(long salt) {
this.salt=salt;
}
Si vous regardez la chaîne des exceptions, le problème est
Causé par: org.hibernate.PropertyNotFoundException: impossible de définir un séparateur pour la propriété salt dans la classe backend.Account
Le problème est que la méthode Account.setSalt () fonctionne correctement lorsque vous créez une instance, mais pas lorsque vous récupérez une instance de la base de données. En effet, vous ne voulez pas créer de nouveau sel chaque fois que vous chargez un compte.
Pour résoudre ce problème, créez une méthode setSalt (long) avec une visibilité privée et Hibernate sera en mesure de définir la valeur (juste une note, je pense que cela fonctionne avec Private, mais vous devrez peut-être la transformer en paquet ou protégée).
Dans mon cas, le problème était dû à des bocaux en conflit.
Voici la liste complète des pots qui fonctionne parfaitement pour moi.
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