2011-02-08 41 views
10

Tôi đang bối rối với một vấn đề cấu hình Hibernate/JPA đó là ngăn chặn các đối tượng JPA-chú thích của tôi khỏi bị tự động đăng ký:Làm thế nào để tự động đăng ký tổ chức với JPA/Hibernate: Unknown tổ chức

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) 

Trong lớp thực thể của tôi tôi có:

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

Và trong MySQL, bảng Ngôn ngữ trông giống như:

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

Và Persis của tôi tence.xml trông giống như:

<?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: dưới đây là cách tôi nhận được EntityManager của tôi và sự bền bỉ:

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

Trả lời

11

Nó hóa ra khá đơn giản: liệt kê cla sses trực tiếp trong tệp persistence.xml. Cả armandino và MikelRascher đều đưa tôi đến câu trả lời này, mặc dù gián tiếp, vì thế đạo diễn cho họ.

Đây là persistence.xml Tôi đang sử dụng hiện nay:

<?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

Bạn thật tuyệt vời !! Tôi có thể khắc phục vấn đề của mình. Đôi ngón tay cái lên !!!! Tôi sẽ đề nghị bạn chấp nhận câu trả lời của bạn – Chris

1

How are you xây dựng quản lý tổ chức của bạn?

Bạn nên nhìn vào các thông điệp mức INFO log4j từ ngủ đông bằng cách thiết lập này trong 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 

Bạn sẽ thấy lớp học của bạn trong các thông điệp:

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 

Đến DEBUG nếu bạn cần thêm thông tin.

CSONG Bạn không đề cập đến tên của đơn vị lưu giữ khi bạn tạo trình quản lý đối tượng. Có lẽ đó không phải là quan trọng:

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

Hi Mike, tôi đã thêm mã của tôi để nhận được EntityManager cho câu hỏi của tôi ở trên. Tôi không thấy tên lớp của tôi trong thông tin đăng nhập. cảm ơn. –

4

Cập nhật

Dưới đây là một cách tiếp cận nhiều hơn JPA như:

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

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

orm.xml nên tìm một cái gì đó như thế này:

<?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, có vẻ như là Hibernate cụ thể. Khi tôi cố gắng này tôi nhận được: Gây ra bởi: org.hibernate.HibernateException: /hibernate.cfg.xml không tìm thấy. Có cách JPA tổng quát hơn để thực hiện việc này không? Cảm ơn! –

+0

'Ejb3Configuration' không được chấp nhận và bị xóa trong Hibernate 5+. – Stephan