3

カスタムオブジェクトのコレクションがあり、JPAを使用して最も簡単な方法でそれを永続化したいと思います。

CustomObjectのクラスはテーブルにマップされています。ここで、JPAがオブジェクトコレクションを処理するための何らかのユーティリティを提供するかどうか疑問に思っています。

特に、コレクションにオブジェクトを追加またはコレクションからオブジェクトを削除してから、save(Collection<CustomObject> cco)変更されたオブジェクト(追加する必要があるオブジェクトと削除するオブジェクト)を確認せずにメソッドに渡したいです。

出来ますか?

4

2 に答える 2

9

コレクションを保存または更新するものを探しているならEntityManager、答えはノーです。ループして保存または更新を行う必要があります。

APIを使用EntityManager.merge()する場合、レコードが存在する場合は更新され、そうでない場合は新しいレコードが挿入されます。

削除に関する限り、JPAまたは他のORMは、そのインスタンスを削除するかどうかをどのように判断しますか。列を更新するようなソフト削除の場合は、is_activemergetrue/falseを呼び出すことで実行できますが、必要な場合はハード削除すると、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 に答える