动态建表jpa可能遇到的其中一个问题 - 已解决

最近项目中需要根据用户的动作来建数据库表,项目中使用的是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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值