我尝试将Grails 1.3.7与插件gorm-jpa 0.7.1结合使用,以使用EclipseLink 2.2.0作为持久性提供程序来启用JPA持久性。
当运行应用程序并单击带有JPA注释的实体的 Controller 时,我从EclipseLink的JPQLParser获得了“UnwantedTokenException”:
Executing action [list] of controller [model.PersonController] caused exception:
An exception occurred while creating a query in EntityManager:
Exception Description: Syntax error parsing the query [select person from model.Person as person ], line 1, column 24: syntax error at [.].
Internal Exception: UnwantedTokenException(found=., expected 80);
at org.eclipse.persistence.internal.libraries.antlr.runtime.BaseRecognizer.recoverFromMismatchedToken(BaseRecognizer.java:587)
[...]
at org.eclipse.persistence.internal.jpa.parsing.jpql.JPQLParser.parse(JPQLParser.java:134)
grails create-app GrailsJPA
cd GrailsJPA
grails uninstall-plugin hibernate
grails install-plugin gorm-jpa
grails create-domain-class model.Person
package model
import javax.persistence.*;
@Entity
class Person {
@Id
@GeneratedValue
long id;
@Basic
long version;
@Basic
String firstName
@Basic
String lastName
static constraints = {
firstName(nullable:true)
lastName(nullable:true)
}
}
grails generate-controller model.Person
grails generate-view model.Person
beans = {
entityManagerFactory(org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean) {
beanClassLoader = ref("classLoader")
dataSource = ref("dataSource")
loadTimeWeaver = new org.springframework.instrument.classloading.SimpleLoadTimeWeaver()
}
transactionManager(org.springframework.orm.jpa.JpaTransactionManager) {
entityManagerFactory = entityManagerFactory
}
}
<?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="manager" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<class>model.Person</class>
<properties>
<property name="eclipselink.ddl-generation" value="create-tables"/>
</properties>
</persistence-unit>
</persistence>
lib\eclipselink.jar
grails run-app
http://localhost:8080/GrailsJPA
最佳答案
我设法通过以下方式使EclipseLink 2.3.0 JPA提供程序与不在软件包中的域类一起工作。
在下面的文章中,我将展示如何设置一个Grails应用程序,该应用程序使用EclipseLink作为JPA提供程序来持久化域类并在Tomcat 6 Web容器中运行该应用程序。
开始于
grails create-app GrailsJPA
cd GrailsJPA
grails uninstall-plugin hibernate
grails install-plugin gorm-jpa
grails create-domain-class Person
import javax.persistence.*;
@Entity
class Person {
@Id
@GeneratedValue
long id;
@Basic
long version;
@Basic
String firstName
@Basic
String lastName
static constraints = {
firstName(nullable:true)
lastName(nullable:true)
}
}
grails generate-controller Person
grails generate-view Person
[...]
def save = {
Person.withTransaction {
[...original code stays in this block...]
}
}
[...]
def edit = {
Person.withTransaction {
[...original code stays in this block...] }
}
}
def update = {
Person.withTransaction {
[...original code stays in this block...]
}
}
def delete = {
Person.withTransaction {
[...original code stays in this block...]
}
}
[...]
<?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="manager" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<class>Person</class>
<properties>
<property name="eclipselink.ddl-generation" value="create-tables"/>
</properties>
</persistence-unit>
</persistence>
lib\eclipselink.jar
beans = {
entityManagerFactory(org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean) {
dataSource = ref("dataSource")
beanClassLoader = ref("classLoader")
loadTimeWeaver = new org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver()
}
transactionManager(org.springframework.orm.jpa.JpaTransactionManager) {
entityManagerFactory = entityManagerFactory
}
}
if exist "%CATALINA_HOME%\lib\spring-agent-2.5.6.SEC02.jar" set JAVA_OPTS=%JAVA_OPTS% -javaagent:%CATALINA_HOME%\lib\spring-agent-2.5.6.SEC02.jar
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"/>
</Context>
[...]
development {
dataSource {
dbCreate = "create-drop"
url = "jdbc:hsqldb:mem:testDB"
}
}
test {
dataSource {
dbCreate = "create-drop"
url = "jdbc:hsqldb:mem:testDb"
}
}
production {
dataSource {
dbCreate = "create-drop"
url = "jdbc:hsqldb:mem:testDB"
}
}
[...]
grails war
"%CATALINA_HOME%\bin\startup.bat"
http://localhost:8080/GrailsJPA
http://grails.org/Download
http://www.eclipse.org/eclipselink/downloads/2.3.0
http://tomcat.apache.org/download-60.cgi
http://mvnrepository.com/artifact/org.springframework/spring-instrument-tomcat
http://mvnrepository.com/artifact/org.springframework/spring-agent
关于grails - 将Grails 1.3.7与EclipseLink 2.2.0 JPA Provider一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7272058/