【问题标题】:Handling collection updates with JPA使用 JPA 处理集合更新
【发布时间】:2012-05-18 16:57:07
【问题描述】:

我有一组自定义对象,我想使用 JPA 以最简单的方式将其持久化。

我的CustomObject 类映射到一个表。现在我想知道 JPA 是否提供了某种实用程序来处理对象收集。

特别是我想在我的集合中添加或删除对象,然后传递给save(Collection<CustomObject> cco) 方法而不检查哪些对象已更改(我需要添加哪些对象以及删除哪些对象......)

有可能吗?

【问题讨论】:

    标签: java hibernate jpa collections


    【解决方案1】:

    如果您正在EntityManager 中寻找可以保存或更新收藏的内容,答案是否定的。您将不得不循环并进行保存或更新。

    如果您使用EntityManager.merge() API,它将在记录存在时更新,否则将插入新记录。

    就删除而言,JPA 或任何其他 ORM 将如何确定您要删除该实例,如果它是软删除,例如将 is_active 之类的列更新为 true/false,那么可以通过调用合并它可以,但是如果你想要硬删除,那么 JPA 将无法自行确定,你必须手动进行。

    【讨论】:

    • +1 删除部分是最棘手的部分,您应该为您的对象(或另一个列表并通过索引保持关系)提供某种元数据,以了解哪些应该更新和应该删除哪些。
    • 是的,删除不是那么容易,映射必须在某个地方:)
    【解决方案2】:

    简要说明:所以我有用户及其相应的权限。我希望能够使用这些信息维护我的数据库。

    这是我使用的解决方案:

    豆类:

    ...
    @Entity
    public class User implements Serializable {
    ...
    @OneToMany(mappedBy = "idu", cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}, orphanRemoval = true)
    private List<Userrights> userRightsList;
    ...
    }
    
    
    ...
    @Entity
    public class Userrights implements Serializable {
    ...
    @JoinColumn(name = "idu", referencedColumnName = "idu")
    @ManyToOne
    private User idu;
    ...
    }
    

    春天:

    @Component
    public class UserBean implements IUser {
    
        @Autowired
        private MyPersistenceContext<User> pc;
        ...
        @Transactional
        @Override
        public void update(User user) throws Exception {
            pc.update(user, UPDATE_ERR);
        }
        ...
    }
    
    @Component
    public class MyPersistenceContext<T> {
        @PersistenceContext
        protected EntityManager EM;
        ...
        public void insert(T object, String errMsg) {
            EM.persist(object);
        }
        public void update(T object, String errMsg) {
            EM.merge(object);
        }
    ...
    }
    
    public void delete(T object, String errMsg) {
        T forDeletion = null;
    
        if (!EM.contains(object)) {
            forDeletion = EM.merge(object);
        }
    
        if (forDeletion != null) {
            EM.remove(forDeletion);
        }
    }
    

    测试:

    @Test
    public void testDb_InsertOrUpdateOfExistinguserRights() throws Exception {
            User u = null;
            try {
                u = IAS.DS().user().getByUsername("kor1 username");
            } catch (Exception e) {
            }
    
            List<Userrights> lur = new ArrayList<>();
            boolean newUser = true;
    
            if (u != null) {
                newUser = false;
                lur = IAS.DS().userRights().get(u);
            } else {
                u = new User("kor1", "kor1 prezime", "kor1 username", "kor1 pass");
            }
    
            if (lur.isEmpty()) {
                lur.add(new Userrights(u, IAS.DS().roles().get(1)));
                lur.add(new Userrights(u, IAS.DS().roles().get(2)));
                lur.add(new Userrights(u, IAS.DS().roles().get(4)));
            } else {
                lur.clear();
                lur.add(new Userrights(u, IAS.DS().roles().get(1)));
                lur.add(new Userrights(u, IAS.DS().roles().get(5)));
            }
    
            u.setUserRightsList(lur);
            if (!newUser) {
                IAS.DS().user().update(u);
            } else {
                IAS.DS().user().insert(u);
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-04
      • 2017-09-19
      • 1970-01-01
      相关资源
      最近更新 更多