2012-05-18 63 views
2

我有一組自定義對象,我想用最簡單的方式使用JPA來堅持它。我的CustomObject類映射到一個表。現在我想知道JPA是否提供了某種用於處理對象收集的實用工具。使用JPA處理集合更新

特別是我想添加或刪除對象到/從我的集合,然後傳遞給save(Collection<CustomObject> cco)方法而不檢查哪些對象已更改(哪些我需要添加,哪些刪除...)

可能嗎?

回答

8

如果您正在尋找EntityManager將保存或更新一個集合的東西,答案是否定的。您將不得不循環並執行保存或更新。

如果您使用EntityManager.merge() API,它將在記錄存在時更新,否則將插入新記錄。

就刪除而言,JPA或任何其他ORM將如何確定要刪除該實例,如果將其更新爲像is_activetrue/false這樣的列的軟刪除,那麼通過調用合併就可以完成,但如果你想要硬刪除,那麼JPA將不能自行確定,你將不得不手動完成。

+0

+1刪除部是獲取棘手的一個,你應該有某種爲對象的元數據(或其他列表,並維持通過索引的關係)知道哪些應該被更新,哪些應該被刪除。 – Gamb

+0

是的,刪除無法做到那麼容易,映射必須是那裏的地方:) – mprabhat

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