JPA atualização de dados

9 respostas
A

E ai pessoal, tudo bem?
Estou desenvolvendo uma aplicação com JPA2.0.
Tenho uma entidade a qual consigo persistir, todavia não consigo fazer update nos relacionamentos oneToMany

@Entity
@Table(name = "cesta")
public class Cesta implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(unique = true, nullable = false)
	int id

	@Column(length = 150, nullable = false)
	String nome

	@Column(length = 1)
	String identificador

	@Lob
	String descricao

	@ElementCollection 
	@CollectionTable(name="palavra_chave")
	List<PalavraChave> palavraChave = new ArrayList<PalavraChave>()

        @OneToMany(mappedBy = "cesta", cascade = CascadeType.ALL)
	List<CestaCha> cha = new ArrayList<CestaCha>()

Caso eu retire algum elemento da lista de palavraChave ou da lista cha, ele não retira do banco de dados com update.
A aplicação não dá erro, diz que foi atualizado, mas o banco continua igual como estava.

Para dar update nas entidades utilizo o seguinte código.

// update entidade
	public T update(T entidade) {
		EntityManager em = JPAUtil.getInstance().getEntityManager();
		try {
			entidade = em.merge(entidade);
			em.getTransaction().commit();
			return entidade;
		} catch (PersistenceException e) {
			// log
			em.getTransaction().rollback();
			return null;
		} finally {
			em.close();
		}
	}

Alguem sabe se a anotação @ElementCollection faz cascade? ou estou fazendo algo errado ?

9 Respostas

H

Pq List está como EllementCollection? E não um relacionamento normal tipo ManyToMany ou coisa do tipo? O.o

A

esta com EllementCollection pq é um atributo multivalorado, poderia ter feito também com outro relacionamento como vc falou, mas fiz assim para nao ter de fazer outra entidade.

H

esta com EllementCollection pq é um atributo multivalorado, poderia ter feito também com outro relacionamento como vc falou, mas fiz assim para nao ter de fazer outra entidade.

PalavraChave já não é uma outra entidade?
Sempre vi EllementCollection sendo utilizado com String, Enum e assim vai…

A

Nesse site tem um exemplo com telefones, no meu caso aqui, esta funcionando para persistir, mas quando vou dar um update e antes eu acrescento ou retiro um elemento da lista ele não atualiza.

H

ATEN:

Nesse site tem um exemplo com telefones, no meu caso aqui, esta funcionando para persistir, mas quando vou dar um update e antes eu acrescento ou retiro um elemento da lista ele não atualiza.

Mas no caso telefone não é uma Entidade, é um embbeded (não sei se a sua classe é uma entidade):@Embeddable public class Phone { private String type; private String areaCode; @Column(name="P_NUMBER") private String number; ... } Note também a diferença em como ele anotou a lista dele e como você anotou sua lista.

A

Hebert Coelho:
ATEN:

Nesse site tem um exemplo com telefones, no meu caso aqui, esta funcionando para persistir, mas quando vou dar um update e antes eu acrescento ou retiro um elemento da lista ele não atualiza.

Mas no caso telefone não é uma Entidade, é um embbeded (não sei se a sua classe é uma entidade):@Embeddable public class Phone { private String type; private String areaCode; @Column(name="P_NUMBER") private String number; ... } Note também a diferença em como ele anotou a lista dele e como você anotou sua lista.

Sim é verdade no caso do @ElementCollection esta estranho mesmo, mas pq eu nao consigo entao pelo menos atualizar a outra lista, quando eu dou merge?

@OneToMany(mappedBy = "cesta", cascade = CascadeType.ALL) List<CestaCha> cha = new ArrayList<CestaCha>()

H

ATEN:
Sim é verdade no caso do @ElementCollection esta estranho mesmo, mas pq eu nao consigo entao pelo menos atualizar a outra lista, quando eu dou merge?

@OneToMany(mappedBy = "cesta", cascade = CascadeType.ALL) List<CestaCha> cha = new ArrayList<CestaCha>()

Não sei. Eu teria que olhar mais código para imaginar.
Talvez outra pessoa possa ver e matar a charada.

R

é impressão minha ou você NÃO está iniciando a transação ?

A

Eu inicializo sim a transação, tenho um singleton para inicializar o EntityManagerFactory e quando busco o entity manager eu o devolvo iniciando a transação.

Criado 15 de janeiro de 2013
Ultima resposta 16 de jan. de 2013
Respostas 9
Participantes 3