2012-05-18 2 views
2

У меня есть коллекция пользовательских объектов, и я хотел бы сохранить ее самым простым способом с помощью JPA.Обработка обновления коллекции с помощью JPA

Класс CustomObject сопоставляется с таблицей. Теперь мне интересно, поддерживает ли JPA какую-то утилиту для обработки коллекции объектов.

В частности, я хотел бы добавить или удалить объекты в/из моей коллекции, а затем перейти к методу save(Collection<CustomObject> cco), не проверяя, какие объекты были изменены (какие из них мне нужно добавить и какие удалить ...)

Возможно ли это?

ответ

8

Если вы ищете что-то в EntityManager, которое сохранит или обновит коллекцию, ответ будет отрицательным. Вам нужно будет выполнить цикл и выполнить сохранение или обновление.

Если вы используете API EntityManager.merge(), он будет обновляться, если запись существует или в нее будет добавлена ​​новая запись.

Насколько удаление обеспокоено, как JPA или любой другой ORM определит, что вы хотите удалить этот экземпляр, если его мягкое удаление как обновление столбца, как is_active к true/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); 
     } 
    } 
Смежные вопросы