这与Spring Boot无关。
我的英语可能不太好。
使用下面的配置来使用Spring Data尝试执行DML请求。
确切地说,我正在使用 CrudRepository#save
方法。
然而,当我执行Spring的CrudRepository#save方法时,我得到了以下结果:
- 只有通过
hibernate.show_sql
特性记录的选择日志。 - 没有"insert"或"update"语句被执行,因为没有日志记录。
- 数据库中根本没有任何变化。
====================================================
不确定,但这似乎是一个事务问题。
看起来在那个点上没有事务,
所以在事务之外,CRUD Repos 无法执行DML请求,包括 CrudRepository#save
。
也许配置有问题?请查看并随时要求提供任何其他信息。
更新: 下面这个不良实践的解决方法帮助我执行了"Update"语句。
//(autowired, shared entity manager)
entityManager.joinTransaction();
repository.save(user);
然而这仍然是一种不良的做法。在这种情况下,Spring的目的失去了意义。 无论如何,我需要使用基于声明的代码事务管理。 问题仍然存在: 我的配置出了什么问题?@Transactional注释仍然不起作用。
用户域实体:
@Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@Entity
@Table(name = "users")
public class User
{
@Id
@Column(name = "id_pk", length = 11)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int idPk;
@Column(name = "user_id", length = 25, nullable = false, unique = true)
private String userId;
@Column(name = "email_addr", length = 120)
private String email;
}
领域特定的Spring Data CRUD存储库声明:
public interface UserRepository extends CrudRepository<User, Integer> {
//nothing specific
}
Spring(无Boot)基于代码的配置:
@EnableJpaRepositories(basePackages = "***",
transactionManagerRef = "jpaTransactionManager")
@EnableTransactionManagement
public class DataConfig
{
@Bean
public EntityManagerFactory entityManagerFactory()
{
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setDataSource(dataSource());
factory.setPackagesToScan(DOMAIN_ENTITY_SCAN_PACKAGE);
factory.setJpaVendorAdapter(getVendorAdapter());
factory.afterPropertiesSet();
return factory.getObject();
}
private HibernateJpaVendorAdapter getVendorAdapter()
{
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setShowSql(Boolean.TRUE);
return vendorAdapter;
}
@Bean
public JpaTransactionManager jpaTransactionManager()
{
JpaTransactionManager txManager = new JpaTransactionManager();
txManager.setEntityManagerFactory(entityManagerFactory());
txManager.afterPropertiesSet();
return txManager;
}
}