我有一組自定義對象,我想用最簡單的方式使用JPA來堅持它。我的CustomObject
類映射到一個表。現在我想知道JPA是否提供了某種用於處理對象收集的實用工具。使用JPA處理集合更新
特別是我想添加或刪除對象到/從我的集合,然後傳遞給save(Collection<CustomObject> cco)
方法而不檢查哪些對象已更改(哪些我需要添加,哪些刪除...)
可能嗎?
我有一組自定義對象,我想用最簡單的方式使用JPA來堅持它。我的CustomObject
類映射到一個表。現在我想知道JPA是否提供了某種用於處理對象收集的實用工具。使用JPA處理集合更新
特別是我想添加或刪除對象到/從我的集合,然後傳遞給save(Collection<CustomObject> cco)
方法而不檢查哪些對象已更改(哪些我需要添加,哪些刪除...)
可能嗎?
如果您正在尋找EntityManager
將保存或更新一個集合的東西,答案是否定的。您將不得不循環並執行保存或更新。
如果您使用EntityManager.merge()
API,它將在記錄存在時更新,否則將插入新記錄。
就刪除而言,JPA或任何其他ORM將如何確定要刪除該實例,如果將其更新爲像is_active
至true/false
這樣的列的軟刪除,那麼通過調用合併就可以完成,但如果你想要硬刪除,那麼JPA將不能自行確定,你將不得不手動完成。
是@ElementCollection你在找什麼?或者你只需要定義一個@OneToMany關係?
簡要說明:所以我有用戶及其相應的權利。我希望能夠與這些信息保持我的數據庫。
這是一個解決方案,我用:
豆類:
...
@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);
}
}
+1刪除部是獲取棘手的一個,你應該有某種爲對象的元數據(或其他列表,並維持通過索引的關係)知道哪些應該被更新,哪些應該被刪除。 – Gamb
是的,刪除無法做到那麼容易,映射必須是那裏的地方:) – mprabhat