2011-02-08 9 views
10

stumped con un problema di configurazione di Hibernate/JPA che impedisce le mie entità JPA-annotato da essere registrati automaticamente:Come auto-registrarsi entità con JPA/Hibernate: un'entità sconosciuta

java.lang.IllegalArgumentException: Unknown entity: com.example.crm.server.model.Language 
    at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:671) 
    at com.example.crm.server.model.Language.persist(Language.java:64) 
    at com.example.crm.server.LanguageTest.testPersistAndRemove(LanguageTest.java:32) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 

Nella mia classe di entità ho:

@Entity 
@Table(name="Languages") 
public class Language implements Serializable 
{ 
    @Id 
    private Long id; 
    private String name; 
    // etc... 
} 

E in MySQL, tabella Lingue assomiglia:

+-------------+----------+------+-----+---------+-------+ 
| Field  | Type  | Null | Key | Default | Extra | 
+-------------+----------+------+-----+---------+-------+ 
| Language_ID | int(11) | NO | PRI | NULL |  | 
| Name  | char(18) | YES |  | NULL |  | 
+-------------+----------+------+-----+---------+-------+ 
2 rows in set (0.00 sec) 

E il mio Persis tence.xml assomiglia:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" 
      version="1.0"> 

    <persistence-unit name="crm"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 

     <properties> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/> 
      <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/> 
      <property name="hibernate.connection.url" value="jdbc:mysql://localhost/crm"/> 
      <property name="hibernate.connection.username" value="crmuser"/> 
      <property name="hibernate.connection.password" value="mypass"/> 
      <property name="hibernate.c3p0.min_size" value="5"/> 
      <property name="hibernate.c3p0.max_size" value="20"/> 
      <property name="hibernate.c3p0.idleTestPeriod" value="30"/> 
      <property name="hibernate.c3p0.timeout" value="0"/> 
      <property name="hibernate.c3p0.max_statements" value="0"/> 
      <property name="hibernate.format_sql" value="true"/> 
      <property name="hibernate.query.jpaql_strict_compliance" value="false"/> 
      <property name="hibernate.validator.apply_to_ddl" value="false"/> 
      <property name="hibernate.validator.autoregister_listeners" value="false"/> 
      <property name="hibernate.archive.autodetection" value="class, hbm"/> 
      <property name="hibernate.hbm2ddl.auto" value="create"/> 
     </properties> 
    </persistence-unit> 

</persistence> 

EDIT: ecco come sto ottenendo il mio EntityManager e persistente:

public void persist() 
{ 
    EntityManager em = entityManager(); 
    try 
    { 
     em.getTransaction().begin(); 
     em.persist(this); 
     em.getTransaction().commit(); 
    } 
    finally 
    { 
     em.close(); 
    } 
} 

public static EntityManager entityManager() 
{ 
    return EMF.get().createEntityManager(); 
} 

risposta

11

E ' si è rivelato abbastanza semplice: elencare il cla sses direttamente nel file persistence.xml. Sia l'armandino che MikelRascher mi hanno portato a questa risposta, anche se indirettamente, così propensi a loro.

Ecco il persistence.xml che sto usando ora:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" 
      version="1.0"> 

    <persistence-unit name="crm"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 

     <class>com.example.Language</class> 

     <properties> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/> 
      <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/> 
      <property name="hibernate.connection.url" value="jdbc:mysql://localhost/crm"/> 
      <property name="hibernate.connection.username" value="myuser"/> 
      <property name="hibernate.connection.password" value="mypass"/> 
      <property name="hibernate.c3p0.min_size" value="5"/> 
      <property name="hibernate.c3p0.max_size" value="20"/> 
      <property name="hibernate.c3p0.idleTestPeriod" value="30"/> 
      <property name="hibernate.c3p0.timeout" value="0"/> 
      <property name="hibernate.c3p0.max_statements" value="0"/> 
      <!--property name="hibernate.show_sql" value="true"/>--> 
      <property name="hibernate.format_sql" value="true"/> 
      <property name="hibernate.query.jpaql_strict_compliance" value="false"/> 
      <property name="hibernate.validator.apply_to_ddl" value="false"/> 
      <property name="hibernate.validator.autoregister_listeners" value="false"/> 
      <property name="hibernate.archive.autodetection" value="class, hbm"/> 
      <property name="hibernate.hbm2ddl.auto" value="create"/> 
     </properties> 
    </persistence-unit> 

</persistence> 
+0

Sei fantastico !! Potrei risolvere il mio problema. Doppio pollice in alto !!!! Ti suggerirei di accettare la tua risposta – Chris

1

Come stai costruendo la tua entity manager?

Si dovrebbe guardare i messaggi di livello INFO log4j da Hibernate impostando questo in log4j.properties:

# Hibernate logging options (INFO only shows startup messages) 
log4j.logger.org.hibernate=INFO 

# Log JDBC bind parameter runtime arguments 
log4j.logger.org.hibernate.type=INFO 

si dovrebbe vedere la classe nei messaggi:

15:39:37,519 INFO Version:156 - Hibernate Commons Annotations 3.2.0.Final 
15:39:37,527 INFO Environment:148 - Hibernate 3.6.0.Final 
15:39:37,529 INFO Environment:148 - hibernate.properties not found 
15:39:37,532 INFO Environment:148 - Bytecode provider name : javassist 
15:39:37,535 INFO Environment:148 - using JDK 1.4 java.sql.Timestamp handling 
15:39:37,588 INFO Version:156 - Hibernate EntityManager 3.6.0.Final 
15:39:38,036 INFO AnnotationBinder:156 - Binding entity from annotated class: com.example.crm.server.model.Language 

Vai per eseguire il debug se hai bisogno di più informazioni

ANNO Non si menziona il nome dell'unità di persistenza quando si crea il gestore di entità. Forse questo non è importante:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("crm"); 
EntityManager em = emf.createEntityManager(); 
+0

Ciao Mike, ho aggiunto il mio codice per ottenere l'EntityManager alla mia domanda di cui sopra. Non sto vedendo il mio nome di classe nelle informazioni di registrazione. Grazie. –

4

Aggiornamento

Ecco un approccio più JPA simile:

Ejb3Configuration ejb3Configuration = new Ejb3Configuration(); 
ejb3Configuration.addResource("META-INF/orm.xml"); 
ejb3Configuration.configure("persistence.xml"); 

EntityManagerFactory factory = ejb3Configuration.buildEntityManagerFactory(); 
EntityManager em = factory.createEntityManager(); 

E orm.xml dovrebbe essere simile a questa:

<?xml version="1.0" encoding="UTF-8" ?> 
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd" 
    version="1.0"> 
    <package>org.example</package> 
    <entity class="org.example.MyEntity"/> 
    <entity class="org.example.AnotherEntity"/> 
</entity-mappings> 
+2

Hmm, sembra essere specifico di Hibernate. Quando provo questo ottengo: Causato da: org.hibernate.HibernateException: /hibernate.cfg.xml non trovato. C'è un modo più generico di fare questo in JPA? Grazie! –

+0

'Ejb3Configuration' è deprecato e rimosso in Hibernate 5+. – Stephan

Problemi correlati