Considérons la hiérarchie:
Et les classes et XML suivantes:
HibernateUtil.Java
package annotations;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
/**
*
* @author X3
*
*/
public class HibernateUtil {
private static final SessionFactory sessionFactory = buildSessionFactory();
private static final String HIBERNATE_CFG = "hibernateAnnotations.cfg.xml";
private static SessionFactory buildSessionFactory()
{
Configuration cfg = new Configuration().addResource(HIBERNATE_CFG).configure();
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().
applySettings(cfg.getProperties()).buildServiceRegistry();
SessionFactory sessionFactory = cfg.buildSessionFactory(serviceRegistry);
return sessionFactory;
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
Users.Java
package annotations;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import Java.sql.Timestamp;
@Entity
@Table(name = "Users")
public class Users {
@Id
@GeneratedValue
@Column(name = "USER_ID")
private long userID;
@Column(name = "USERNAME", nullable = false, length = 100)
private String username;
@Column(name = "MessageTimeDate", nullable = false)
private Java.sql.Timestamp datetime;
@Column(name = "UserMessage", nullable = false)
private String message;
public Users(String username , String message)
{
Java.util.Date date = new Java.util.Date();
this.datetime = new Timestamp(date.getTime());
this.username = username;
this.message = message;
}
public long getUserID() {
return userID;
}
public void setUserID(long userID) {
this.userID = userID;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Java.sql.Timestamp getDatetime() {
return datetime;
}
public void setDatetime(Java.sql.Timestamp datetime) {
this.datetime = datetime;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
Main.Java
package annotations;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
public class Main {
public static void main(String[] args) {
try
{
SessionFactory sf = HibernateUtil.getSessionFactory();
Session session = sf.openSession();
session.beginTransaction();
Users user1 = new Users("Jack" , "Hello");
session.save(user1);
session.getTransaction().commit();
session.close();
}
catch (Exception e)
{
System.out.println(e.toString());
e.getStackTrace();
}
}
}
Et hibernateAnnotations.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>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/CHAT_DB</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<property name="connection.pool_size">1</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="current_session_context_class">thread</property>
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">create</property>
<mapping class="annotations.Users"></mapping>
</session-factory>
</hibernate-configuration>
Lorsque j'exécute main (), l'erreur suivante apparaît dans la fenêtre de sortie:
org.hibernate.MappingException: Unknown entity: annotations.Users
Mais l'entité Users
est dans le paquet annotations
, alors qu'est-ce qui ne va pas?
Le fichier de configuration d'Hibernate doit définir les classes d'entité:
<mapping class="annotations.Users"/>
Ou vous devez explicitement ajouter la classe à la configuration en utilisant
configuration.addClass(annotations.Users.class)
// Read mappings as a application resourceName
// addResource is for add hbml.xml files in case of declarative approach
configuration.addResource("myFile.hbm.xml"); // not hibernateAnnotations.cfg.xml
Lorsque j'essayais de réécrire mon exemple (à partir de tutorialspoint) pour utiliser des annotations, j'ai eu la même exception. Cela m'a aidé (addAnnotatedClass ()):
Configuration cfg=new Configuration();
cfg.addAnnotatedClass(com.tutorialspoint.hibernate.entity.Employee.class);
cfg.configure();
Ajoutez ce qui suit à votre XML:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan">
<list>
<value>annotations</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
Pour ceux qui utilisent les classes de configuration Java de Spring, vous pouvez écrire ce qui suit:
@Autowired
@Bean(name = "sessionFactory")
public SessionFactory getSessionFactory(DataSource dataSource) {
LocalSessionFactoryBuilder sessionBuilder = new LocalSessionFactoryBuilder(dataSource);
sessionBuilder.addProperties(getHibernateProperties());
sessionBuilder.addAnnotatedClasses(Foo.class);
sessionBuilder.addAnnotatedClasses(Bar.class);
sessionBuilder.addAnnotatedClasses(Bat.class);
return sessionBuilder.buildSessionFactory();
}
J'avais le même problème.
Utilisez @javax.persistence.Entity
au lieu de org.hibernate.annotations.Entity
Si votre entité est mappée par des annotations, ajoutez le code suivant à votre configuration.
configuration.addAnnotatedClass(theEntityPackage.EntityClassName.class);
Par exemple;
configuration.addAnnotatedClass(com.foo.foo1.Products.class);
si votre entité est mappée avec un fichier XML, utilisez addClass au lieu de addAnnotatedClass.
Par exemple;
configuration.addClass(com.foo.foo1.Products.class);
Ping moi si vous avez besoin de plus d'aide.
Je faisais face au même problème et j'ai cherché pendant près de 2 heures et essayé de différentes manières, comme le remplacement d'anciens JAR en veille prolongée et la modification du schéma de la table de base de données. Mais finalement obtenu la solution ci-dessous:
SessionFactory factory = new Configuration().configure().buildSessionFactory(); //This line to be replaced with below commented line
Remplacer ci-dessus pour
//Configuration config = new Configuration().configure();
//ServiceRegistry servReg = new StandardServiceRegistryBuilder().applySettings(config.getProperties()).build();
//SessionFactory factory = config.buildSessionFactory(servReg);
Cela fonctionnera alors très bien ..
Au lieu d'utiliser HibernateUtil.Java, pour créer un objet sessionfactory, vous devriez utiliser ceci:
SessionFactory sessionFactory=new AnnotationConfiguration().configure().buildSessionFactory();
Parce que pour éviter l'exception, vous devez déclarer l'objet de classe dans le fichier HibernateUtil.Java comme étant configuration.addAnnotatedClass(Student_Info.class);
, ce qui est bête, car nous avons fourni l'entrée déjà dans le fichier hibernate.cfg.xml.
Pour utiliser la classe AnnotationConfiguration, vous devez ajouter un fichier jar au chemin de génération de votre projet: http://www.Java2s.com/Code/Jar/h/Downloadhibernate353jar.htm
J'avais un problème similaire et en ajoutant
sessionFactory.setAnnotatedClasses(User.class);
cette ligne a aidé mais avant que je devais
sessionFactory.setPackagesToScan(new String[] { "com.rg.spring.model" });
Je ne suis pas sûr de savoir pourquoi celui-ci ne fonctionne pas.La classe utilisateur est sous com.rg.spring.model Merci de me faire savoir comment le faire fonctionner via la méthode packagesToScan.
public static void main(String[] args) {
try{
// factory = new Configuration().configure().buildSessionFactory();
factory = new AnnotationConfiguration().
configure().
//addPackage("com.xyz") //add package if used.
addAnnotatedClass(Employee.class).
buildSessionFactory();
}catch (Throwable ex) {
System.err.println("Failed to create sessionFactory object." + ex);
throw new ExceptionInInitializerError(ex);
}//you can write like this in your test class inside main method.this way you will be able to do the things using annotaions only
Si vous utilisez la version 5.0x, la configuration avec le registre de service standard est deprecated .
Vous devriez plutôt l’amorcer avec Metadata : Dans votre classe HibernateUtil, vous devriez ajouter
private static SessionFactory buildSessionFactory() {
try {
StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder()
.configure( "hibernate.cfg.xml" )
.build();
Metadata metadata = new MetadataSources( standardRegistry )
.getMetadataBuilder()
.build();
return metadata.getSessionFactoryBuilder().build();
} catch(...) {
...
}
}
Vérifiez que le nom du paquet est donné dans la propriété, packagesToScan dans le dispatcher-servlet.xml
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="**entity package name here**"></property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
</props>
</property>
</bean>
Ajoutez le code suivant à hibernate.cfg.xml
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.timeout">300</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
Utilisez EntityScanner si vous pouvez supporter une dépendance externe. Il injectera toutes vos classes d’entités de manière transparente, même à partir de plusieurs packages. Ajoutez simplement la ligne suivante après la configuration.
Configuration configuration = new Configuration().configure();
EntityScanner.scanPackages("com.fz.epms.db.model.entity").addTo(configuration);
// And following depencency if you are using Maven
<dependency>
<groupId>com.github.v-ladynev</groupId>
<artifactId>fluent-hibernate-core</artifactId>
<version>0.3.1</version>
</dependency>
De cette façon, vous n'avez pas besoin de déclarer toutes les entités dans le fichier de mappage hibernate.