2013-10-27 85 views
3

我试图让一个Play 2.2项目与Hibernate JPA和一个PostgreSQL数据库一起工作。我之前使用Play 2.1.1完成了它的工作。我现在得到以下错误:Play 2.2与休眠JPA和Postgres

play.api.UnexpectedException: Unexpected exception[NoClassDefFoundError: org/w3c/dom/ElementTraversal] 
    at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(ApplicationProvider.scala:152) ~[play_2.10.jar:2.2.0] 

我不知道这是从哪里来的。我build.sbt看起来是这样的:

libraryDependencies ++= Seq(
    javaJdbc, 
    cache, 
    javaJpa, 
    "org.apache.directory.api" % "apache-ldap-api" % "1.0.0-M14", 
    "postgresql" % "postgresql" % "9.1-901-1.jdbc4", 
    "org.hibernate" % "hibernate-core" % "4.2.3.Final", 
    "org.hibernate" % "hibernate-entitymanager" % "4.2.3.Final" 
)  

而且我的persistence.xml这样的:

<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_2_0.xsd" 
version="2.0"> 

<persistence-unit name="defaultPersistenceUnit" 
    transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <non-jta-data-source>DefaultDS</non-jta-data-source> 
    <properties> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" /> 
     <property name="hibernate.hbm2ddl.auto" value="update" /> 
    </properties> 
</persistence-unit> 

我还没有编写任何代码呢,我只是配置它。

+0

此处了解详情:https://github.com/playframework/play-slick/issues/98 – gavioto

回答

2

好吧,自己想出来。这确实是两个版本的xml-apis的问题。一个来自Play本身,另一个来自Apache Directory API。我在build.sbt来改变制造品,它是现在工作:

"org.apache.directory.api" % "api-all" % "1.0.0-M14" 
6

你说你没有写任何代码,所以我决定告诉你我是如何创建新的Play! 2.2使用JPA和Postgresql的应用程序。你可以做同样的事情,并检查差异。

首先,我创建了新的Play应用程序使用命令:

play new testApp 

然后我testApp/conf目录/ META-INF目录下创建persistence.xml文件并与内容填充它:

<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_2_0.xsd" 
     version="2.0"> 

<persistence-unit name="defaultPersistenceUnit" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <non-jta-data-source>DefaultDS</non-jta-data-source> 
    <properties> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/> 
     <!--<property name="hibernate.show_sql" value="true"/>--> 
     <property name="hibernate.hbm2ddl.auto" value="update"/> 
     <property name="hibernate.format_sql" value="true"/> 
    </properties> 
</persistence-unit> 

添加到我的testApp/conf/application.conf中:

jpa.default=defaultPersistenceUnit 
db.default.driver=org.postgresql.Driver 
db.default.url="postgres://postgres:[email protected]/test" 

# You can expose this datasource via JNDI if needed (Useful for JPA) 
db.default.jndiName=DefaultDS 

我还创建样本模型类:

@Entity 
@SequenceGenerator(name = "Token_generator", sequenceName = "test_sequence", allocationSize = 1, initialValue = 1) 
public class Test { 

    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "Token_generator") 
    public Long id; 

    public String name; 
} 

我开始播放应用程序使用命令:

play ~run 

然后,我能看到在HTTP下工作的网站://本地主机:9000 /地址。 我也能够在postgres测试数据库中看到新的表测试。

+0

我需要连接什么库使用Hibernate注释?我配置了build.sbt,application.conf和persistence.xml,但是编译器得到了一个注释错误。 – gooamoko

0

我自己进一步缩小了范围。它接受它是由我使用的org.apache.directory.api导致的冲突。它在没有这个库的情况下工作。我从sbt收到以下消息:

[error] Relocation to an other version number not supported in ivy : xml-apis#xml-apis;2.0.2 relocated to xml-apis#xml-apis;1.0.b2 
. Please update your dependency to directly use the right version. 

但我不知道如何解决这个冲突。

+0

你搜索org.apache.directory.api的新版本吗?我在他们的页面上看到了版本1.0.0-M20。 – bandit