5

我正在关注

https://glassfish.java.net/javaee5/persistence/persistence-example.html

在 Java SE 环境中测试 JPA。在 Eclipse 中,我:

  • 创建了一个新的 JPA (2.1) 项目;
  • 在 options->JPA->Persistent class management 中,我选择了“Discover annotated classes automatically”而不是“Annotated classes must be listed in persistence.xml”。

我成功导入了 zip 文件 (Client.java Customer.java Order.java) 中的树 Java 类,并修改了 persistence.xml 文件以满足我的需要。但是在尝试执行 main 时出现以下错误。

[EL Info]: 2013-10-18 17:37:54.749--ServerSession(263489307)--EclipseLink, version: Eclipse Persistence Services - 2.5.1.v20130918-f2b9fc5
[EL Info]: connection: 2013-10-18 17:37:55.34--ServerSession(263489307)--file:/home/caterpillar/workspace/JPA_Java_SE/build/classes/_JPA_Java_SE login successful
[EL Warning]: metamodel: 2013-10-18 17:37:55.359--The collection of metamodel types is empty. Model classes may not have been found during entity search for Java SE and some Java EE container managed persistence units.  Please verify that your entity classes are referenced in persistence.xml using either <class> elements or a global <exclude-unlisted-classes>false</exclude-unlisted-classes> element
Exception in thread "main" java.lang.IllegalArgumentException: Object: entity.Customer@5e80188f is not a known entity type.
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.registerNewObjectForPersist(UnitOfWorkImpl.java:4228)
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.persist(EntityManagerImpl.java:496)
    at client.Client.testInsert(Client.java:82)
    at client.Client.main(Client.java:49)

持久性.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    <persistence-unit name="JPA_Java_SE">
        <properties>
            <property name="javax.persistence.logging.level" value="FINE"/>
            <property name="javax.persistence.logging.thread" value="false"/>
            <property name="javax.persistence.logging.session" value="false"/>
            <property name="javax.persistence.logging.timestamp" value="false"/>
            <property name="javax.persistence.logging.exceptions" value="false"/>

            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=utf8"/>
            <property name="javax.persistence.jdbc.user" value="root"/>
            <property name="javax.persistence.jdbc.password" value="password"/>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
        </properties>
    </persistence-unit>
</persistence>

项目目录树

$ tree
.
├── build
│   └── classes
│       ├── client
│       │   └── Client.class
│       ├── entity
│       │   ├── Customer.class
│       │   └── Order.class
│       └── META-INF
│           └── persistence.xml
├── sql
│   ├── tables_derby.sql
│   └── tables_oracle.sql
└── src
    ├── client
    │   └── Client.java
    ├── entity
    │   ├── Customer.java
    │   └── Order.java
    └── META-INF
        └── persistence.xml

10 directories, 10 files

所有类代码都与http://glassfish.dev.java.net/javaee5/persistence/JPASE.zip上的示例文件相同

4

2 回答 2

8

您的 : 中缺少下一行persistence.xml

<exclude-unlisted-classes>false</exclude-unlisted-classes>

该行的放置方式如下例所示:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
  <persistence-unit name="SamplePU" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
      <property name="javax.persistence.jdbc.url" value="jdbc:derby://localhost:1527/sample"/>
      <property name="javax.persistence.jdbc.password" value="123"/>
      <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver"/>
      <property name="javax.persistence.jdbc.user" value="root"/>
      <property name="eclipselink.logging.level" value="ALL"/>
      <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
    </properties>
  </persistence-unit>
</persistence>
于 2013-10-18T16:42:50.363 回答
3

还有另一个选项,类似于 Paul Vargas 提出的选项,也可以编辑 persistence.xml 文件。

如果您想更好地控制将哪些类作为实体进行管理,请使用:

<exclude-unlisted-classes>true</exclude-unlisted-classes>

<class>YOUR CLASS CANNONICAL NAME</class>

于 2014-04-10T20:43:56.163 回答