Как обновить две таблицы с помощью jpa с java? - PullRequest
0 голосов
/ 10 июля 2020

У меня есть служба, которая должна обновлять две таблицы с именами Ajustes и Valores

image

public class ClasePruebaImpl{
     @Setter
     private PruebaOperacion pruebaOperacion;
     
     public void actualizar(final ClaseEntrada){
     
        pruebaOperacion.operacionActualizar(claseEntrada.getComponente(), claseEntrada.getModulo());
     }
     
}

и класс, который должен выполнить журнал обновлений c, где Ajustes и Valores - классы сущностей , которые уже сопоставлены, но я не знаю, как обновить

Кто-нибудь поможет мне, как это сделать, какие методы мне следует использовать?

@Stateless
@LocalBean
public class PruebaOperacion{

 @PersistenceContext(unitName = "USER_PU")
  private EntityManager entityManager;
 
  @Interceptors(CheckpointMonitor.class)
  public void operacionActualizar(Integer componente, Integer modulo){
  
    //Entidades
    final Ajustes ajustes = new Ajustes();
    final Valores valores = new Valores();
  
  }
 
}

Это вопрос о том, как я реализую обновление

UPDATE USER_PU.AJUSTES SET VALOR = 'Nuevo valoe 99'
WHERE TIPO = 'NEW' AND LLAVE= 'PRUEBA_COMPONENTE_A';

UPDATE USER_PU.VALORES SET VALOR= '99'
WHERE ID_AJUSTE = (SELECT ID_AJUSTE FROM USER_PU.AJUSTES WHERE TIPO = 'NEW' AND LLAVE = 'PRUEBA_COMPONENTE_A');

1 Ответ

0 голосов
/ 22 июля 2020

Есть три способа, самый простой - с помощью @NamtiveQuery, но, с моей точки зрения, худший, потому что он противоречит философии JPA, второй - с менеджером сущностей, получающим и обновляющим сущность, а третий - с массивом операций.

1.- Собственный запрос

Query q1= entityManager.createNativeQuery(
                " UPDATE USER_PU.AJUSTES SET VALOR = :nuevoValor1"+ 
                " WHERE TIPO = :tipo1 AND LLAVE= :llave1;");

q1.setParameter("nuevoValor1", "Nuevo valoe 99");
q1.setParameter("tipo1", "NEW");
q1.setParameter("llave1", "PRUEBA_COMPONENTE_A");
q1.executeUpdate();

2.- Найти объект и обновить

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Ajustes> cq = cb.createQuery(Ajustes.class);
Root<Ajustes> rootAjustes = cq.from(Ajustes.class);

cq.where(
    cb.and(cb.equal(rootAjustes.get(Ajustes_.tipo),"NEW"),
        cb.equal(rootAjustes.get(Ajustes_.llave),"PRUEBA_COMPONENTE_A")));

//BBDD entity
Ajustes resultado = em.createQuery(cq).getSingleResult();
//Update fields
resultado.setValor("nuevoValor1");
//Persist changes
entityManager.merge(resultado);

3.- Массовая операция (новое в JPA 2.1)

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaUpdate<Ajustes> cu = cb.createCriteriaUpdate(Ajustes.class);
Root<Ajustes> rootAjustes = cu.from(Ajustes.class);

cu.set(rootAjustes.get(Ajustes_.valor), "Nuevo valoe 99");

cu.where(
    cb.and(cb.equal(rootAjustes.get(Ajustes_.tipo),"NEW"),
        cb.equal(rootAjustes.get(Ajustes_.llave),"PRUEBA_COMPONENTE_A")));

return entityManager.createQuery(cu).executeUpdate();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...