最近项目中需要根据用户的动作来建数据库表,项目中使用的是SpringBoot框架,使用JPA对数据库操作
public void createTable(String reportDate){
String tableName = "mytable_" + reportDate;
StringBuffer sql = new StringBuffer("create table if not exists " + tableName + " like mytable");
Query query = em.createNativeQuery(sql.toString());
query.executeUpdate();
//以上是使用JPA中的方法,执行报错
//下面是获取Session的方式,还是执行失败
Session s = (Session) em.getDelegate();
s.doWork(connection -> {
PreparedStatement stmt = connection.prepareStatement("CREATE TABLE if not exists mytable_201908 like mytable");
stmt.execute();
});
}
使用JPA的方法是报错如下
Caused by: javax.persistence.TransactionRequiredException: Executing an update/delete query
使用Session时报错如下
Caused by: org.hibernate.ResourceClosedException: org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl@7ebc2975 is closed
解决方式
使用JPA做UPDATE或DELETE操作时需要多加两个Annotation,举个例子:
@Query("UPDATE User u SET u.password=?2 WHERE u.userName=?1")
@Modifying
@Transactional
void updatePwd(String userName, String pwd);
答案来源于网络
就是方法体上面加
@Modifying
@Transactional