hibernate多对多插入数据时覆盖上一次插入的数据解决方案

场景:

一种Product可以被多个User购买
一个User可以购买多种Product

所以Product和User之间的关系是多对多 many-to-many
要实现多对多关系,必须有一张中间表 user_product 用于维护User和Product之间的关系


案发现场:

如下代码会覆盖上一次插入的数据:
public class TestHibernate {
    public static void main(String[] args) {
        SessionFactory sf = new Configuration().configure().buildSessionFactory();

        Session s = sf.openSession();
        s.beginTransaction();

        //增加3个用户
        Set<User> users = new HashSet();
        for (int i = 0; i < 3; i++) {
            User u =new User();
            u.setName("user"+i);
            users.add(u);
            s.save(u);
        }

        //产品1被用户1,2,3购买
        Product p1 = (Product) s.get(Product.class, 1);

        p1.setUsers(users);
        s.save(p1);
        s.getTransaction().commit();
        s.close();
        sf.close();
    }
}

解决方案一:

public class TestHibernate {
    public static void main(String[] args) {

        SessionFactory sf = new Configuration().configure().buildSessionFactory();  
        Session s = sf.openSession();   
        s.beginTransaction();

        Set<User> users = new HashSet();    //创建几个User
        for(int i=0; i<3; i++){
            User u = new User();
            u.setName("user"+i);
            users.add(u);
            s.save(u);
        }

        Product p1 = (Product) s.get(Product.class, 6);
        Set<User> us = p1.getUsers(); 
        for(User u : us){
            users.add(u);   //关键是这里,将新的user追加上去
        }
        p1.setUsers(users); //将新数据加进去
        s.save(p1);  //这样就不会覆盖掉之前的数据

        s.getTransaction().commit();
        s.close();
        sf.close();     
    }   
}

解决方案二:

public class TestHibernate {

    public static void main(String[] args) {

        SessionFactory sf = new Configuration().configure().buildSessionFactory();  
        Session s = sf.openSession();   
        s.beginTransaction();

        Set<User> users = new HashSet();    //创建几个User
        for(int i=0; i<3; i++){
            User u = new User();
            u.setName("user"+i);
            users.add(u);
            s.save(u);
        }

        Product p1 = (Product) s.get(Product.class, 6);
        for(User u : users){
            p1.getUsers().add(u); 
        }

        s.save(p1);

        s.getTransaction().commit();
        s.close();
        sf.close(); 
    }
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!关于您提到的问题,可能是由于批量更新的事务管理配置不正确导致的。在 Hibernate 中,批量更新操作需要在同一个事务中进行,以确保数据的一致性和完整性。 以下是一些可能导致您遇到问题的原因和解决方案: 1. 没有正确配置事务管理器:请确认您的 Hibernate 配置文件中是否正确配置了事务管理器。在 Hibernate 中,可以使用诸如 JTA、JDBC 或 Spring 的事务管理器来管理事务。确保您选择了适合您项目的事务管理器,并正确配置它。 2. 没有显式地开启事务:在进行批量更新操作之前,您需要显式地开启一个事务。您可以使用 `beginTransaction()` 方法来开启一个事务,并在批量更新操作完成后使用 `commit()` 方法提交事务。 3. 批量更新操作没有在同一个事务中:确保您的批量更新操作都在同一个事务中进行。可以使用 Hibernate 的 `Session` 对象来执行批量操作,确保在同一个事务中执行。 以下是一个示例代码片段,展示了如何正确地进行批量更新操作: ``` Session session = sessionFactory.getCurrentSession(); Transaction transaction = null; try { transaction = session.beginTransaction(); // 执行批量更新操作 // ... transaction.commit(); } catch (Exception e) { if (transaction != null) { transaction.rollback(); } // 处理异常 } finally { session.close(); } ``` 请注意,上述代码中的 `sessionFactory` 是 Hibernate 的会话工厂对象,您需要将其替换为您项目中实际使用的会话工厂。 希望这些解决方案可以帮助您解决问题!如果您有任何进一步的问题,请随提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值