Tenho uma entidade que não consigo atualizar a lista: [list]private List cha = new ArrayList(); [/list].
Consigo persistir e atualizar os outros atributos.
@Entity
@Table(name = "disciplina")
public class Disciplina implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(nullable = false, unique = true)
private int id;
@Column(nullable = false, length = 150)
private String nome;
@Column(nullable = false, length = 26)
private String senha;
@Column(nullable = false, length = 150)
private String curso;
@Lob
@Column(nullable = false)
private String descricao;
//lista que nao consigo atualizar
@OneToMany(mappedBy = "disciplina", cascade = CascadeType.ALL)
private List<DisciplinaCha> cha = new ArrayList<DisciplinaCha>();
// usuario criador da disciplina
@ManyToOne(optional = false)
private Usuario usuario;
// usuarios participantes da turma
@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(name= "participa")
private List<Usuario> usuarios = new ArrayList<Usuario>();
// getters e setters
Método que utilizo para atualizar
public Disciplina atualizaDisciplina(Disciplina disciplina){
EntityManager em = JPAUtil.getInstance().getEntityManager();
EntityTransaction tx = em.getTransaction();
try{
tx.begin();
disciplina = em.merge(disciplina);
tx.commit();
return disciplina;
}catch(Exception e){
tx.rollback();
System.out.println("erro atualiza disciplina");
e.printStackTrace();
return null;
}finally{
em.close();
}
}
Achei que se eu somente desse merge ele atualizaria todos atributos que tivessem cascade.All
Pois quando eu persisto a entidade Disciplina com em.persist(Disciplina) ele salva a entidade disciplina e todas as outras listas.
Alguem poderia me explicar por que isso nao ocorre com o merge?
A curto prazo vejo que uma solução seria recuperar os registros da entidade DisciplinaCha por query, verificar se eles se encontram na lista da entidade Disciplina ainda nao atualizada e
remover os registros diretamente.
public Disciplina atualizaDisciplina(Disciplina disciplina){
EntityManager em = JPAUtil.getInstance().getEntityManager();
EntityTransaction tx = em.getTransaction();
String comando = "Select u from DisciplinaCha u where u.disciplina = ?1"; //query para buscar
try{
tx.begin();
Query q = em.createQuery(comando);
q.setParameter(1, disciplina);
List<DisciplinaCha> cha = q.getResultList();
for (DisciplinaCha disciplinaCha : cha) {
if(!disciplina.getCha().contains(disciplinaCha))
em.remove(disciplinaCha); //removendo os que não se encontram mais
}
disciplina = em.merge(disciplina);
em.flush();
tx.commit();
return disciplina;
}catch(Exception e){
tx.rollback();
System.out.println("erro atualiza disciplina");
e.printStackTrace();
return null;
}finally{
em.close();
}
}
Assim eu sei que funciona, são atualizados todos os dados, mas pq somente o merge não faz isso???
Aguem poderia me explicar
[]s