Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

I'm stumped with a Hibernate/JPA configuration issue that's preventing my JPA-annotated entities from being automatically registered:

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)

In my entity class I have:

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

And in MySQL, the Languages table looks like:

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

And my persistence.xml looks like:

<?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: here's how I'm getting my EntityManager and persisting:

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();
}
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
222 views
Welcome To Ask or Share your Answers For Others

1 Answer

It turned out to be fairly simple: list the classes directly in the persistence.xml file. Both armandino and MikelRascher led me to this answer, though indirectly, so props to them.

Here is the persistence.xml I'm using now:

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
...