簡體   English   中英

如何使用JPA / Hibernate自動注冊實體:未知實體

[英]How to auto-register entities with JPA/Hibernate: Unknown entity

我遇到了Hibernate / JPA配置問題,這會阻止我的JPA注釋實體被自動注冊:

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)

在我的實體課中,我有:

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

在MySQL中,Languages表看起來像:

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

我的persistence.xml看起來像:

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

編輯 :這是我如何得到我的EntityManager並堅持:

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

事實證明這很簡單:直接在persistence.xml文件中列出類。 armandino和MikelRascher都引導我這個答案,雖然是間接的,所以對他們來說是道具。

這是我現在使用的persistence.xml:

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

更新

這是一個更像JPA的方法:

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

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

orm.xml看起來像這樣:

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

你是如何構建實體經理的?

您應該通過在log4j.properties中設置來查看來自hibernate的INFO級別log4j消息:

# 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

您應該在消息中看到您的課程:

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

如果您需要更多信息,請轉到DEBUG。

另外 ,在創建實體管理器時,您沒有提到持久性單元的名稱。 也許那不重要:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM