使用JPA处理集合更新

时间:2012-05-18 16:57:07

标签: java hibernate jpa collections

我有一组自定义对象,我想以最简单的方式使用JPA来保留它。

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

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

有可能吗?

3 个答案:

答案 0 :(得分:8)

如果您正在EntityManager寻找可以保存或更新集合的内容,答案是肯定的。您必须循环并进行保存或更新。

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

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

答案 1 :(得分:0)

@ElementCollection您要找的是什么?或者您只需要定义@OneToMany关系吗?

答案 2 :(得分:0)

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

这是我使用的解决方案:

豆类

...
@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);
        }
    }