【发布时间】:2020-08-27 09:59:19
【问题描述】:
这根本与 Spring Boot 无关。
我的英语可能会更好。
使用下面的 Config for Spring Data 我正在尝试执行 DML 请求。
正是CrudRepository#save 方法。
但是我接下来要执行 Spring 的 CrudRepository#save 方法:
-
hibernate.show_sql功能仅记录选择。 - 没有针对 hibernate.show_sql 日志记录执行“插入”或“更新”语句。
- 数据库完全没有变化。
================================================ =====
不确定,但看起来像是事务问题。
当时好像没有交易,
因此事务 CRUD Repos 无法执行 DML 请求,
包括CrudRepository#save。
也许是配置有问题? 请查看并随时询问任何其他信息。
更新: 下一个错误的解决方法帮助我实现了“更新”语句的执行。
//(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 Repository 声明:
public interface UserRepository extends CrudRepository<User, Integer> {
//nothing specific
}
Spring (无引导) 基于代码的配置:
@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;
}
}
【问题讨论】:
-
把id改成非原始类型,这样可以取null值,否则去insert的时候总是PK 0
-
@JLazar0 感谢您的建议,但这一点与我上面描述的问题无关。