J'essaie de travailler sur la deuxième édition de Beginning Hibernate, et je suis coincé pour essayer de créer un exemple de travail simple avec HSQLDB.
Quand je lance ant populateMessages
, je reçois
[Java] org.hibernate.MappingException: Unknown entity: sample.entity.Message
[Java] at org.Apache.tools.ant.taskdefs.ExecuteJava.execute(ExecuteJava.Java:194)
[Java] at org.Apache.tools.ant.taskdefs.Java.run(Java.java:747)
...
Voici ce que j'ai
Message.Java
package sample.entity;
import org.hibernate.annotations.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
public class Message
{
private String messageText;
private Integer id;
public Message( String messageText )
{
this.messageText = messageText;
}
public Message()
{
}
public String getMessageText()
{
return messageText;
}
public void setMessageText(String messageText)
{
this.messageText = messageText;
}
@Id
@GeneratedValue
public Integer getId()
{
return id;
}
public void setId(Integer id)
{
this.id = id;
}
}
PopulateMessages.Java
package sample;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
import sample.entity.Message;
import Java.util.Date;
public class PopulateMessages
{
public static void main(String[] args)
{
SessionFactory factory = new AnnotationConfiguration().configure().buildSessionFactory();
Session session = factory.openSession();
session.beginTransaction();
Message m1 = new Message("Hibernated a messages on " + new Date());
session.save(m1);
session.getTransaction().commit();
session.close();
}
}
build.properties
# Path to the hibernate install directory
hibernate.home=C:/hibernate/hibernate-3.5.6
# Path to the hibernate-tools install directory
hibernate.tools.home=C:/hibernate/hibernate-tools
# Path to hibernate-tools.jar relative to hibernate.tools.home
hibernate.tools.path=/plugins/org.hibernate.Eclipse_3.3.1.v201006011046R-H111-GA/lib/tools
# Path to hibernate-tools hibernate libraries relative to hibernate.tools.home
hibernate.tools.lib.path=/plugins/org.hibernate.Eclipse_3.3.1.v201006011046R-H111-GA/lib/hibernate
# Path to the SLF4J implementation JAR for the logging framework to use
slf4j.implementation.jar=lib/slf4j-simple-1.6.1.jar
# Path to the HSQL DB install directory
hsql.home=C:/hsqldb
hibernate.cfg.xml
<!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="hibernate.connection.url">
jdbc:hsqldb:file:testdb;shutdown=true
</property>
<property name="hibernate.connection.driver_class">
org.hsqldb.jdbcDriver
</property>
<property name="hibernate.connection.username">sa</property>
<property name="hibernate.connection.password"></property>
<property name="hibernate.connection.pool_size">0</property>
<property name="hibernate.dialect">
org.hibernate.dialect.HSQLDialect
</property>
<property name="hibernate.show_sql">false</property>
<!-- "Import" the mapping resources here -->
<mapping class="sample.entity.Message"/>
</session-factory>
</hibernate-configuration>
build.xml
<project name="sample">
<property file="build.properties"/>
<property name="src" location="src"/>
<property name="bin" location="bin"/>
<property name="sql" location="sql"/>
<property name="hibernate.tools"
value="${hibernate.tools.home}${hibernate.tools.path}"/>
<path id="classpath.base">
<pathelement location="${src}"/>
<pathelement location="${bin}"/>
<pathelement location="${hibernate.home}/hibernate3.jar"/>
<pathelement location="${slf4j.implementation.jar}"/>
<fileset dir="${hibernate.home}/lib" includes="**/*.jar"/>
<pathelement location="${hsql.home}/lib/hsqldb.jar"/>
<fileset dir="./lib" includes="**/*.jar"/>
</path>
<path id="classpath.tools">
<path refid="classpath.base"/>
<pathelement
location="${hibernate.tools.home}/${hibernate.tools.lib.path}/commons-logging-1.0.4.jar"/>
<pathelement
location="${hibernate.tools}/freemarker.jar"/>
<pathelement
location="${hibernate.tools}/hibernate-tools.jar"/>
</path>
<taskdef name="htools"
classname="org.hibernate.tool.ant.HibernateToolTask"
classpathref="classpath.tools"/>
<target name="exportDDL" depends="compile">
<mkdir dir="${sql}"/>
<htools destdir="${sql}">
<classpath refid="classpath.tools"/>
<annotationconfiguration
configurationfile="${src}/hibernate.cfg.xml"/>
<hbm2ddl drop="true" outputfilename="sample.sql"/>
</htools>
</target>
<target name="compile">
<javac srcdir="${src}" destdir="${bin}" classpathref="classpath.base"/>
</target>
<target name="populateMessages" depends="compile">
<Java classname="sample.PopulateMessages" classpathref="classpath.base"/>
</target>
<target name="listMessages" depends="compile">
<Java classname="sample.ListMessages" classpathref="classpath.base"/>
</target>
Votre entité n'est pas correctement annotée, vous devez utiliser l'annotation @javax.persistence.Entity
. Vous pouvez utiliser l'extension Hibernate @org.hibernate.annotations.Entity
pour aller au-delà de ce que JPA peut offrir, mais l'annotation Hibernate n'est pas un remplacement, c'est un complément.
Alors changez votre code en:
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
public class Message {
...
}
Vous devriez appeler .addAnnotatedClass(Message.class)
sur votre AnnotationConfiguration
.
Si vous voulez que vos entités soient auto-découvertes, utilisez EntityManager
(JPA)
( Référence )
Mise à jour: il semble que vous ayez répertorié la classe dans hibernate.cfg.xml. La découverte automatique n'est donc pas nécessaire. Btw, essayez javax.persistence.Entity
Mon problème a été résolu après avoir ajouté
sessionFactory.setPackagesToScan ( new String [] {"com.springhibernate.model"}); Testé cette fonctionnalité au printemps dernière version 2.1.2.
Méthode complète:
@Bean( name="sessionFactoryConfig")
public LocalSessionFactoryBean sessionFactoryConfig() {
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
sessionFactory.setDataSource(dataSourceConfig());
sessionFactory.setPackagesToScan(
new String[] { "com.springhibernate.model" });
sessionFactory.setHibernateProperties(hibernatePropertiesConfig());
return sessionFactory;
}
Utilisez la ligne de code ci-dessous dans le cas de l'application d'amorçage Spring Ajoutez-la à la classe principale d'amorçage Spring @EntityScan (basePackageClasses = YourClassName.class)
Utilisezimport javax.persistence.Entity; Au lieu deimport org.hibernate.annotations.Entity;
vous devez ajouter tous les fichiers d'entité à la méthode .addAnnotatedClass (Class), si la classe doit être découverte automatiquement.
utilisez ce lien, cela pourrait aider ..
http://docs.jboss.org/hibernate/stable/core/api/org/hibernate/cfg/AnnotationConfiguration.html
utiliser la ligne de code ci-dessous dans le cas d'applications à démarrage par ressort.
@EntityScan (basePackageClasses = YourClassName.class)
J'ai rencontré le même problème lorsque je suis passé à AnnotationSessionFactoryBean
. J'utilisais entity.hbm.xml
avant.
J'ai trouvé qu'il manquait ma classe à l'annotation suivante, ce qui a résolu le problème dans mon cas:
@Entity
@Table(name = "MyTestEntity")
@XmlRootElement
Si vous obtenez cette exception dans l'application SpringBoot
alors que les entités sont annotées avec une annotation Entity
, il se peut que le printemps ne sache pas où rechercher les entités.
Pour spécifier explicitement le package, ajoutez ci-dessous
@SpringBootApplication
@EntityScan({"model.package.name"})
public class SpringBootApp {...}
remarque: Si vos classes de modèle résident dans le même ou dans des sous-packages de la classe annotée SpringBootApplication
, il n'est pas nécessaire de déclarer explicitement la EntityScan
. Par défaut, elle sera analysée.