基本的なSpringMVC/ JPA/Hibernateアプリを作成しました。UserProfileエンティティを保存して、実際に永続化できるかどうかをテストしようとしていますが、何も保存されず、例外もスローされません。
コントローラメソッドで、単純なUserProfile(@Entity)を作成し、それをサービスメソッドに送信しています。UserProfileServiceImplクラスには@Serviceの注釈が付けられ、addUserProfile(UserProfile profile)メソッドには@Transactionalの注釈が付けられます。
serviceメソッドでは、DAOメソッド(@Repositoryで注釈が付けられたクラス)を呼び出すだけです。DAOメソッドでは、entityManager.persist(object)を呼び出すだけで、オブジェクトはユーザープロファイルオブジェクトになります。
- サーバーログには何も書き込まれず、ログレベルはINFOです。
- Mysqlクエリログには何も表示されません(そしてクエリログが機能することはわかっています)
- entityManagerは適切に注入されます。
- 誤ったクレデンシャルを入力するとSQLExceptionsが発生するため、データソースは適切に開始されます。
何が悪いのか教えていただければ幸いです。以下に私のコードと設定ファイルのいくつかを投稿します。
サービス方法:
// The service method gets called from the controller.
// Its class is annotated with @Service
@Transactional(readOnly = false)
public void addUserProfile(UserProfile userProfile) {
userProfileDao.save(userProfile);
}
Daoメソッド:
// The save(T object) method is in the GenericDaoJpa class, which is the superclass
// of the UserProfileDaoJPA class that is referenced from the service.
// I have established that the entityManager is there and the object is a
// UserProfile. The @Repository annotation is on the child class UserProfileDaoJpa.
public void save(T object) {
entityManager.persist(object);
}
メインアプリケーション-context.xml
<context:property-placeholder location="classpath*:**/*.properties"/>
<import resource="spring-jpa.xml"/>
application-context-web.xmlファイル
<mvc:annotation-driven />
<context:component-scan base-package="nl.codebasesoftware.produx" />
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
spring-jpa.xml
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" p:driverClassName="${db.driverClassName}"
p:url="${db.url}" p:username="${db.username}" p:password="${db.password}"/>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
p:dataSource-ref="dataSource"/>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
p:entityManagerFactory-ref="entityManagerFactory"/>
<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager"/>
<bean id="defaultLobHandler" class="org.springframework.jdbc.support.lob.DefaultLobHandler"/>
persistence.xml
<persistence-unit name="mysqlPersistenceUnit" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
</properties>
</persistence-unit>
<!-- Needed to properly process @PersistenceContext -->
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>
どういうわけか、この設定ではSQLはMysqlに送信されませんが、例外もスローされないため、何が起こっているのかわかりません。あなたが助けることができることを願っています:)