2

私の EclipseLink と Spring (MVC と spring-data) バージョン 3.1.1 のセットアップに関する別の質問:

この記事に従って、persistence.xml ファイルを使用せずに JPA を機能させようとしています。記事では次のように述べています。

通常、JPA は META-INF/persistence.xml ファイルを介して永続化ユニットを定義します。Spring 3.1 以降、この XML ファイルは不要になりました。LocalContainerEntityManagerFactoryBean は、@Entity クラスをスキャンするパッケージを指定できる「packagesToScan」プロパティをサポートするようになりました。

persistence.xml ファイルは、最後に削除された XML の一部でした。現在、JPA は XML なしで完全にセットアップできます。

persistence.xml ファイルを使用する場合、ここにあるすべてのエンティティ クラスをここで宣言する必要があることを理解しています。packagesToScanただし、代わりにプロパティを利用しようとしています。以下は、完全な起動ログと、最終的にデータベースに新しいユーザーを作成しようとするサーブレットに 1 つの要求を行った後に生成されたエラーです。Userオブジェクトがエンティティであることを認識していないようです。私はSpringの経験がほとんどないので、誰かが最初に私が犯している間違いを見つけることができるかどうか疑問に思っていましたが、そうでなければ、これをデバッグする最良の方法を知っています. EntityManagerFactory で認識されている Entity オブジェクトを知りたいです。

私のバックアップ オプションは、persistence.xml の使用に切り替えることです (実際にはまだ試していません) が、可能であればそれを取り除きたいです (心配する XML ファイルが 1 つ少なくなります)。

更新: Sean Patrick Floyd の回答に基づいて、entityManagerFactory に推奨される構成変更を加えた後、エラー ログを更新しましたが、主な問題は解決しませんでした。私が行ったことは、persistence.xml ファイル (これを行うための古くて一般的な方法) を作成することによってこれを機能させる別の方法を試し、これを開始するためにアクセスするサーブレット内に小さなテスト コードを追加したことです。機能。これで、サーブレットに次のコードが追加されました。

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();

そして、このpersistence.xmlファイル:

<?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>

これは実際に機能するので、EntityManagerFactory の初期化方法に問題があるのか​​ 、それともそのようなものなのか疑問に思っています。データベース関連の処理を行う UserService クラスのコードを含めました。

完全な起動ログ (エラーを含む) は次のとおりです。

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 ファイル:

<?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 クラス:

/**
 * 
 */
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;
        }
    }

ここに 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;
    }
}
4

4 に答える 4

1

内部例外: java.sql.SQLSyntaxErrorException: object name already exists: USER in statement [CREATE TABLE user (id BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1) NOT NULL, first_name VARCHAR(255), last_name VARCHAR( 255)、主キー (id))]

これが問題のようです: Spring / EclipseLink が既存のテーブルを作成しようとしています。

xml コンテキストから次の行を削除してみてください。

<property name="generateDdl" value="true" />
于 2012-04-26T12:18:56.527 に答える
1

私はこの問題について何日も本当に検索してきましたが、私が思いつくことができる最高のものは、このチュートリアルの JPA の制限に関する小さなメモです: EclipseLink JPA Deployed on Tomcat 6 using Eclipse WTP . 関連セクションには次のように記載されています。

Tomcat は Java EE 5 互換サーバーではないため、JPA にはいくつかの制限があります。

  • 動的ウィービング (インスツルメンテーション) なし - エンティティの静的ウィービングは、EclipseLink を介して引き続き利用できます。
  • @EJBセッション Bean ( を含むEntityManager) のインジェクションは利用できません- 永続化ファクトリとマネージャを直接使用してください。
  • @PersistenceContextコンテナ管理の持続性ユニットの注入は利用でき ません- 使用してPersistence.createEntityManagerFactory(JTA_PU_NAME)ください。

後者の 2 点は、私が抱えている問題に当てはまると思います。私が言うように、テスト コード スニペットで問題なく動作させることができますが、適切に配線しようとすると問題が発生します。したがって、他に答えはありませんが、これが私が解決しなければならないものだと思います。私はそれが非常に満足のいく答えだとは思わないので、それ以上の洞察は大歓迎です。

于 2012-04-29T22:51:16.443 に答える
0

@chrisjleuあなたはとても近いです。eclipse リンクを静的ウィービングを使用するように設定することで、動作するようになりました。

private static final Properties jpaProperties = new Properties();
static {
    jpaProperties.put("eclipselink.logging.level", "INFO");
    jpaProperties.put("eclipselink.weaving", "static");
}

そして、それをに追加しますLocalContainerEntityManagerFactoryBean.setJpaProperties(jpaProperties)

静的ウィービングを機能させるために、AspectJ を使用しています。私のプロジェクトは Maven にあるため、次のプラグインを使用します。

            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>aspectj-maven-plugin</artifactId>
                <version>1.2</version>
                <!-- NB: do not use 1.3 or 1.3.x due to MASPECTJ-90 and do not use 1.4 
                    due to declare parents issue -->
                <dependencies>
                    <!-- NB: You must use Maven 2.0.9 or above or these are ignored (see 
                        MNG-2972) -->
                    <dependency>
                        <groupId>org.aspectj</groupId>
                        <artifactId>aspectjrt</artifactId>
                        <version>${version.aspectj}</version>
                    </dependency>
                    <dependency>
                        <groupId>org.aspectj</groupId>
                        <artifactId>aspectjtools</artifactId>
                        <version>${version.aspectj}</version>
                    </dependency>
                </dependencies>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <goal>test-compile</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <outxml>true</outxml>
                    <aspectLibraries>
                        <aspectLibrary>
                            <groupId>org.springframework</groupId>
                            <artifactId>spring-aspects</artifactId>
                        </aspectLibrary>
                    </aspectLibraries>
                    <source>${version.java}</source>
                    <target>${version.java}</target>
                </configuration>
            </plugin>
于 2013-04-02T15:47:45.023 に答える
0

persistence.xmlファイルはプロジェクトに存在しますか?
その場合はpersistence.xml、プロジェクトから完全に削除してください。packagesToScanこのファイルは、構成のどこにも明示的に言及していなくても、何らかの形でプロパティと競合します。私自身、この特異性に遭遇しました。

于 2013-02-21T10:14:15.613 に答える