我有一组自定义对象,我想使用 JPA 以最简单的方式保存它。
我的CustomObject
班级被映射到一张桌子。现在我想知道 JPA 是否提供了某种实用程序来处理对象收集。
特别是我想在我的集合中添加或删除对象,然后传递给一个save(Collection<CustomObject> cco)
方法而不检查哪些对象已更改(我需要添加哪些对象以及删除哪些对象......)
可能吗?
我有一组自定义对象,我想使用 JPA 以最简单的方式保存它。
我的CustomObject
班级被映射到一张桌子。现在我想知道 JPA 是否提供了某种实用程序来处理对象收集。
特别是我想在我的集合中添加或删除对象,然后传递给一个save(Collection<CustomObject> cco)
方法而不检查哪些对象已更改(我需要添加哪些对象以及删除哪些对象......)
可能吗?
如果您正在寻找EntityManager
可以保存或更新集合的东西,答案是否定的。您将不得不循环并进行保存或更新。
如果您使用EntityManager.merge()
API,如果记录存在,它将更新,否则将插入新记录。
就删除而言,JPA 或任何其他 ORM 将如何确定您要删除该实例,如果它是一个软删除,例如更新一列is_active
,true/false
那么可以通过调用 merge 来完成,但是如果您想要一个硬删除,那么 JPA 将无法自行确定,您必须手动进行。
简要说明:所以我有用户及其相应的权限。我希望能够使用这些信息维护我的数据库。
这是我使用的解决方案:
豆子 :
...
@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);
}
}