gpt4 book ai didi

mysql - Spring JPA不存储实体

转载 作者:行者123 更新时间:2023-11-29 08:49:58 30 4
gpt4 key购买 nike

我创建了一个基本的 Spring MVC/JPA/Hibernate 应用程序。我试图保存一个 UserProfile 实体来测试我是否可以真正保留它,但没有保存任何内容,也没有抛出异常。

在 Controller 方法中,我创建一个简单的 UserProfile (这是一个 @Entity),并将其发送到服务方法。 UserProfileServiceImpl 类使用@Service 注解,addUserProfile(UserProfile profile) 方法使用@Transactional 进行注解。

在服务方法中,我所做的就是调用一个DAO方法(用@Repository注释的类)。在DAO方法中,我所做的就是调用entityManager.persist(object),其中object是用户配置文件对象。

  • 没有任何内容写入服务器日志,日志级别为 INFO。
  • Mysql 查询日志中没有任何内容(并且我知道查询日志有效)
  • entityManager 已正确注入(inject)。
  • 数据源已正确启动,因为当我输入错误的凭据时,我收到 SQLException。

希望你能告诉我出了什么问题。我将在下面发布一些代码和配置文件。

服务方式:

// 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"/>

持久性.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,但也不会引发异常,所以我不知道发生了什么。希望你能帮忙:)

最佳答案

我认为您在服务中缺少事务传播。标记 readonly=false 只是将 session 设置为自动刷新。但是设置正确的事务传播将确保事务操作和提交/回滚的开始。

删除 mode="aspectj"后,它已经开始工作,因为我认为是因为按照 spring 文档

The default mode "proxy" will process annotated beans to be proxied using Spring's AOP framework (following proxy semantics, as discussed above, applying to method calls coming in through the proxy only). The alternative mode "aspectj" will instead weave the affected classes with Spring's AspectJ transaction aspect (modifying the target class byte code in order to apply to any kind of method call). AspectJ weaving requires spring-aspects.jar on the classpath as well as load-time weaving (or compile-time weaving) enabled. (See the section entitled Section 6.8.4.5, “Spring configuration” for details on how to set up load-time weaving.)

并且可能您还没有配置load time weaving

关于mysql - Spring JPA不存储实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11529476/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com