Frühling-Entity-bean nicht bekannt. Mit der neuen Spring 3.1 packagesToScan Eigentum, und kein persistence.xml
Andere Frage für meine EclipseLink und Spring (MVC und spring-data), version 3.1.1 Aufbau:
Ich versuche, JPA arbeiten, ohne die Verwendung des persistence.xml Datei in übereinstimmung mit dieser Artikel. In dem Artikel heißt es:
In der Regel, JPA definiert eine Ausdauer-Einheit durch die
META-INF/persistence.xml Datei. Ab Spring 3.1, diese XML-Datei
ist nicht mehr nötig – das LocalContainerEntityManagerFactorybean
unterstützt jetzt einen 'packagesToScan' - Eigenschaft, wo die Pakete zu Scannen
für die @Entity-Klassen angegeben werden kann.Den persistence.xml Datei wurde das Letzte Stück der XML entfernt werden –
nun, der PPV kann voll eingerichtet mit keine XML.
Ich verstehe, dass, wenn man die Nutzung der persistence.xml Datei, die alle Entity-Klassen, die hier erklärt werden sollte hier. Dennoch versuche ich zu nutzen packagesToScan
- Eigenschaft statt. Unten ist der komplette startup-log und die Fehler produziert, nachdem Sie eine Anfrage an das servlet, die letztlich versucht, erstellen Sie einen neuen Benutzer in der Datenbank. Es scheint nicht zu erkennen, dass die User
Objekt ist eine Entität. Da ich wenig Erfahrung mit Spring, ich Frage mich, wenn jemand, der zunächst können vor Ort einen Fehler, den ich mache, aber sonst, weiß der beste Weg, um zu Debuggen. Ich will wissen, was Entity-Objekte wurden erkannt und von der EntityManagerFactory.
Meine backup-option, um Schalter zu verwenden persistence.xml (haben es nicht versucht es doch eigentlich), aber ich möchte loswerden, dass, wenn möglich (weniger eine XML-Datei zu befürchten).
UPDATE: ich habe aktualisiert das Fehlerprotokoll, nachdem Sie die empfohlene config ändern, um die entityManagerFactory, die auf der Antwort basiert, die von Sean Patrick Floyd aber nicht, lösen das Hauptproblem. Was ich auch getan wird versucht, einen alternativen Weg, um diese arbeiten durch die Schaffung einer persistence.xml Datei (die alte und häufigste Weg, dies zu tun) und fügte hinzu, ein kleines Stück test-code im servlet habe ich Zugang zu den kick-off dieser Funktionalität.
So, jetzt habe ich dieses Stück code in meinem servlet:
User user = new User();
user.setFirstName("John");
user.setLastName("Doe");
//user = userService.addUser(user);
EntityManagerFactory emf = Persistence.createEntityManagerFactory("proxiPU");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
em.persist(user);
em.getTransaction().commit();
em.close();
emf.close();
Und diese persistence.xml Datei:
<?xml version="1.0" encoding="UTF-8" ?>
<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" xmlns="http://java.sun.com/xml/ns/persistence">
<persistence-unit name="proxiPU" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<class>com.proxi.user.User</class>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="eclipselink.jdbc.driver" value="org.hsqldb.jdbcDriver"/>
<property name="eclipselink.jdbc.url" value="jdbc:hsqldb:file:\Users\nly31175\hsqldb;shutdown=true"/>
<property name="eclipselink.jdbc.user" value="proxi"/>
<property name="eclipselink.jdbc.password" value=""/>
<property name="eclipselink.target-database" value="org.eclipse.persistence.platform.database.HSQLPlatform"/>
<property name="eclipselink.logging.level" value="FINEST"/>
<property name="eclipselink.orm.throw.exceptions" value="true"/>
<property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
<property name="eclipselink.ddl-generation.output-mode" value="database"/>
</properties>
</persistence-unit>
</persistence>
Dies tatsächlich funktioniert, so Frage ich mich nun, ob es ein problem mit der Art und Weise der EntityManagerFactory wird initialisiert oder so etwas. Ich habe den code für die Klasse UserService, der soll das tun, das Datenbank-related stuff.
Hier ist die startup-log (einschließlich der Fehler) in voll:
INFO: Reloading Context with name [/proxi] is completed
INFO : com.proxi.controller.HomeController - Welcome home! The client locale is en_GB
[EL Info]: 2012-04-26 15:17:35.066--ServerSession(313687096)--Thread(Thread[http-bio-8980-exec-3,5,main])--EclipseLink, version: Eclipse Persistence Services - 2.2.0.v20110202-r8913
[EL Config]: 2012-04-26 15:17:35.079--ServerSession(313687096)--Connection(1182807222)--Thread(Thread[http-bio-8980-exec-3,5,main])--connecting(DatabaseLogin(
platform=>HSQLPlatform
user name=> ""
connector=>JNDIConnector datasource name=>null
))
INFO : hsqldb.db.HSQLDB36EB6EA7CB.ENGINE - checkpointClose start
INFO : hsqldb.db.HSQLDB36EB6EA7CB.ENGINE - checkpointClose end
[EL Config]: 2012-04-26 15:17:36.016--ServerSession(313687096)--Connection(1257700692)--Thread(Thread[http-bio-8980-exec-3,5,main])--Connected: jdbc:hsqldb:file:\Users\nly31175\hsqldb;shutdown=true
User: proxi
Database: HSQL Database Engine Version: 2.2.6
Driver: HSQL Database Engine Driver Version: 2.2.6
INFO : hsqldb.db.HSQLDB36EB6EA7CB.ENGINE - Database closed
[EL Config]: 2012-04-26 15:17:36.365--ServerSession(313687096)--Connection(385835848)--Thread(Thread[http-bio-8980-exec-3,5,main])--connecting(DatabaseLogin(
platform=>HSQLPlatform
user name=> ""
connector=>JNDIConnector datasource name=>null
))
INFO : hsqldb.db.HSQLDB36EB6EA7CB.ENGINE - checkpointClose start
INFO : hsqldb.db.HSQLDB36EB6EA7CB.ENGINE - checkpointClose end
[EL Config]: 2012-04-26 15:17:36.877--ServerSession(313687096)--Connection(603544782)--Thread(Thread[http-bio-8980-exec-3,5,main])--Connected: jdbc:hsqldb:file:\Users\nly31175\hsqldb;shutdown=true
User: proxi
Database: HSQL Database Engine Version: 2.2.6
Driver: HSQL Database Engine Driver Version: 2.2.6
INFO : hsqldb.db.HSQLDB36EB6EA7CB.ENGINE - Database closed
[EL Info]: 2012-04-26 15:17:37.328--ServerSession(313687096)--Thread(Thread[http-bio-8980-exec-3,5,main])--file:/C:/Users/nly31175/workspace/spring/.metadata/.plugins/org.eclipse.wst.server.core/tmp1/wtpwebapps/proxi/WEB-INF/classes/_default login successful
Apr 26, 2012 3:17:37 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [appServlet] in context with path [/proxi] threw exception [Request processing failed; nested exception is java.lang.IllegalArgumentException: Object: com.proxi.user.User@5ca3ce3f is not a known entity type.] with root cause
java.lang.IllegalArgumentException: Object: com.proxi.user.User@5ca3ce3f is not a known entity type.
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.registerNewObjectForPersist(UnitOfWorkImpl.java:4128)
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.persist(EntityManagerImpl.java:406)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:365)
at $Proxy23.persist(Unknown Source)
at com.proxi.user.UserService.save(UserService.java:27)
at com.proxi.user.UserService.addUser(UserService.java:39)
at com.proxi.controller.HomeController.home(HomeController.java:51)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:213)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:964)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
root-context.xml Datei:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
<!-- Root Context: defines shared resources visible to all other web components -->
<bean id="userService" class="com.proxi.user.UserService" >
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<!-- Starting with Spring 3.1, the persistence.xml XML file is no longer
necessary. The LocalContainerEntityManagerFactoryBean now supports a ‘packagesToScan’
property where the packages to scan for @Entity classes can be specified. -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="jpaDialect" ref="jpaDialect" />
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="com.proxi.user" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter">
<property name="showSql" value="true" />
<property name="generateDdl" value="true" />
<property name="databasePlatform" value="org.eclipse.persistence.platform.database.HSQLPlatform" />
</bean>
</property>
<property name="loadTimeWeaver">
<bean class="org.springframework.instrument.classloading.SimpleLoadTimeWeaver" />
</property>
</bean>
<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.EclipseLinkJpaDialect " />
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.hsqldb.jdbcDriver" />
<property name="url" value="jdbc:hsqldb:file:\Users\nly31175\hsqldb;shutdown=true" />
<property name="username" value="proxi" />
<property name="password" value="" />
</bean>
<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
</beans>
User.java Klasse:
/**
*
*/
package com.proxi.user;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Table;
import javax.persistence.Id;
/**
* Represents an application user.
*/
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
private String lastName;
/////////GETTERS AND SETTERS ///////////
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
Hier UserService.java
package com.proxi.user;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceUnit;
import org.springframework.transaction.annotation.Transactional;
/**
* Performs user related operations.
*
*/
public class UserService {
@PersistenceUnit
private EntityManagerFactory entityManagerFactory;
@Transactional
public User save(User user) {
EntityManager entityManager = entityManagerFactory.createEntityManager();
if (user.getId() == null) {
entityManager.persist(user);
return user;
} else {
return entityManager.merge(user);
}
}
public User findUser(String userid) {
return null;
}
public User addUser(User user) {
return save(user);
}
/////////////////////////GETTERS AND SETTERS //////////////////////
public EntityManagerFactory getEntityManagerFactory() {
return entityManagerFactory;
}
public void setEntityManagerFactory(EntityManagerFactory entityManagerFactory) {
this.entityManagerFactory = entityManagerFactory;
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieser scheint das problem zu sein: Frühjahr /EclipseLink versucht zu erstellen, eine bereits vorhandene Tabelle.
versuchen Sie es mit entfernen dieser Zeile aus der xml-Kontext:
Ich habe wirklich gesucht zu diesem Thema nun seit Tagen und die besten, die ich mit oben kommen kann ist ein kleiner Hinweis auf die Einschränkungen von JPA in diesem tutorial mit dem Titel: EclipseLink JPA Deployment auf Tomcat 6 mit Eclipse WTP. Der entsprechende Abschnitt sagt:
Ich denke die letzten beiden Punkte gelten für das problem, das ich habe. Als ich sagen, kann ich es auf der Arbeit kein problem mit dem test-code-snippet, aber im moment versuche ich, es zu verdrahten richtig bekomme ich ein problem. Also, ohne alle anderen Antworten, ich denke, das ist die, die ich haben Regeln für den. Weitere Einblicke willkommen, obwohl ich nicht finde es eine sehr befriedigende Antwort.
Ist Ihre
persistence.xml
Datei im Projekt vorhanden?Wenn es der Fall ist entfernen Sie
persistence.xml
komplett aus dem Projekt. Diese Datei irgendwie Konflikte mitpackagesToScan
Eigentum, auch wenn Sie nicht explizit erwähnt, es irgendwo in der Konfiguration. Ich selbst gekommen, über diese Besonderheit.@chrisjleu Sie ganz in der Nähe. Ich habe es zu arbeiten, indem Sie die Einstellung eclipse link, um die Verwendung von statischen Weben:
Und fügen Sie es in die
LocalContainerEntityManagerFactoryBean.setJpaProperties(jpaProperties)
Bekommen statischem Weben arbeiten, ich bin mit AspectJ. Mein Projekt ist in Maven, so dass ich die folgenden plugins: