3

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

我的CustomObject班级被映射到一张桌子。现在我想知道 JPA 是否提供了某种实用程序来处理对象收集。

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

可能吗?

4

2 回答 2

9

如果您正在寻找EntityManager可以保存或更新集合的东西,答案是否定的。您将不得不循环并进行保存或更新。

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

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

于 2012-05-18T17:13:06.837 回答
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);
        }
    }
于 2017-12-07T16:04:38.317 回答