【问题标题】:OpenJPA + MySQL issueOpenJPA + MySQL 问题
【发布时间】:2012-03-29 21:22:49
【问题描述】:

我一直在使用 OpenJPA 和 MySQL。这是我的 persistence.xml 文件。

<?xml version="1.0" encoding="UTF-8"?>
<!--
  For DB connectivity  
   -->
      <persistence version="1.0">
        <persistence-unit name="jpa">
          <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
           <class>com.Login</class>
       </persistence-unit>

       <properties>
     <property name="openjpa.ConnectionURL" value="jdbc:mysql://localhost:3306/jpa"/>
          <property name="openjpa.ConnectionDriverName" value="com.mysql.jdbc.Driver"/>
      <property name="openjpa.ConnectionUserName" value="root"/>
      <property name="openjpa.ConnectionPassword" value="root"/>
      <property name="openjpa.jdbc.DBDictionary"  value="mysql(SimulateLocking=true)"/>
    <property name="openjpa.Log" value="DefaultLevel=WARN, Tool=INFO"/>
</properties>

      </persistence>

当我执行我的 Java 类时,我遇到了一个异常,如下所示。如果我在persistence.xml 中使用休眠并更改配置,则相同的代码可以正常工作,但它在OpenJPA 中不起作用。任何人都可以帮助解决这个问题吗?

Exception in thread "main" javax.persistence.PersistenceException: Explicit persistence provider error(s) occurred for "jpa" after trying the following discovered implementations: org.apache.openjpa.persistence.PersistenceProviderImpl from provider: org.apache.openjpa.persistence.PersistenceProviderImpl
    at javax.persistence.Persistence.createPersistenceException(Persistence.java:244)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:186)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:72)
    at com.JPALogin.main(JPALogin.java:26)
Caused by: <openjpa-2.2.0-r422266:1244990 nonfatal general error> org.apache.openjpa.util.GeneralException: org.xml.sax.SAXException: file:/E:/work/JPAPlain/build/classes/META-INF/persistence.xml [Location: Line: 5, C: 28]: org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'persistence'.
    at org.apache.openjpa.lib.meta.XMLMetaDataParser.parseNewResource(XMLMetaDataParser.java:427)
    at org.apache.openjpa.lib.meta.XMLMetaDataParser.parse(XMLMetaDataParser.java:347)
    at org.apache.openjpa.lib.meta.XMLMetaDataParser.parse(XMLMetaDataParser.java:324)
    at org.apache.openjpa.lib.meta.XMLMetaDataParser.parse(XMLMetaDataParser.java:297)
    at org.apache.openjpa.persistence.PersistenceProductDerivation$ConfigurationParser.parse(PersistenceProductDerivation.java:772)
    at org.apache.openjpa.persistence.PersistenceProductDerivation.parseResources(PersistenceProductDerivation.java:556)
    at org.apache.openjpa.persistence.PersistenceProductDerivation.load(PersistenceProductDerivation.java:522)
    at org.apache.openjpa.persistence.PersistenceProductDerivation.load(PersistenceProductDerivation.java:336)
    at org.apache.openjpa.persistence.PersistenceProviderImpl.createEntityManagerFactory(PersistenceProviderImpl.java:86)
    at org.apache.openjpa.persistence.PersistenceProviderImpl.createEntityManagerFactory(PersistenceProviderImpl.java:153)
    at org.apache.openjpa.persistence.PersistenceProviderImpl.createEntityManagerFactory(PersistenceProviderImpl.java:62)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:152)
    ... 2 more

【问题讨论】:

  • 为什么在 XML 元素 之外指定“属性”?他们应该在里面。
  • 是的,那是错误的。即使把它们放在里面,它也没有奏效

标签: mysql jpa openjpa


【解决方案1】:

你试试这样的怎么样?

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
    <!-- For DB connectivity -->
    <persistence-unit name="jpa">
        <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
        <class>com.Login</class>
        <properties>
            <property name="openjpa.ConnectionURL" value="jdbc:mysql://localhost:3306/jpa" />
            <property name="openjpa.ConnectionDriverName" value="com.mysql.jdbc.Driver" />
                    <property name="openjpa.ConnectionUserName" value="root" />
                    <property name="openjpa.ConnectionPassword" value="root" />
                    <property name="openjpa.jdbc.DBDictionary" value="mysql(SimulateLocking=true)" />
                    <property name="openjpa.Log" value="DefaultLevel=WARN, Tool=INFO" />
                </properties>
    </persistence-unit>
</persistence>

【讨论】:

    【解决方案2】:

    SAXParseException:cvc-elt.1:找不到元素“持久性”的声明。在 org.apache.openjpa.lib.meta.XMLMetaDataParser.parseNewResource

    我不能确定,但​​看起来您的persistence.xml 文件的 XML 解析器正在尝试根据 DTD 验证 XML,并且它正在抱怨,因为它无法获得(有用的)DTD。您可能希望将 XML 文件的第一行更改为以下内容:

     <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    

    我不希望无效的 XML 文件或丢失的 DTD 导致解析器因神秘异常而崩溃。因此,如果这是问题的原因,我会说持久性提供程序代码中存在错误。我期待一个更有用的异常,有一条消息说“无效的 XML”,或者类似的。

    【讨论】:

    • 感谢您的回复。我尝试了您提供的线路,但没有解决问题。有没有其他方法可以检查?
    猜你喜欢
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    • 2016-12-25
    • 2012-08-12
    相关资源
    最近更新 更多