Olá galera!
Em uma aplicação com 6 entidades, estou com problemas ao excluir.
Quando excluo um time, ele é excluído sem problemas, mas acaba excluindo também o usuário(s) que têm a referência para o time.
Para não ficar difícil o entendimento, só vou deixar o método para excluir o time.
Tal método também está excluindo o Usuário que tem a id do time que está sendo passado por parâmetro no método excluirTime().
Alguém aí sabe o que posso fazer?
Estou utilizando JPA
public void excluirTime(int idTime) {
System.out.println("\n**********EXCLUSÃO DE TIME**********\n");
daoTime.begin();
Time t = daoTime.find(idTime);
Autor a = new Autor();
if (t == null)
System.out.println("Time inexistente: " + idTime);
else {
a.setTime(null);
t = daoTime.merge(t);
daoTime.remove(t);
System.out.println("Time excluído com sucesso!");
}
daoTime.commit();
}
Um time tem um usuário? Se sim, a resposta pro seu problema pode estar no Cascade, na hora que você escreve a relação entre os dois (tem um Cascade Delete ou Cascade All?).
posta as suas entidades Time e Usuario para vermos o mapeamento que você fez. Fica mais fácil. Está utilizando annotations? Caso contrário, poste o xml.
Abraço.
Schwingel
Não Andre, o usuário é que pode ter um time
Vou postar o mapeamento.
[quote=Schwingel]posta as suas entidades Time e Usuario para vermos o mapeamento que você fez. Fica mais fácil. Está utilizando annotations? Caso contrário, poste o xml.
Abraço.
Schwingel[/quote]
segue o mapeamento Schwingel
o fato de ter Usuário, é que tem 2 tipos. O Autor e o Administrador
obrigado!
Classe Usuario
package Model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Usuario {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private String name;
private String userName;
private String senha;
private String email;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getSenha() {
return senha;
}
public void setSenha(String senha) {
this.senha = senha;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String toString() {
return "Usuário: " + userName + " - " + "Nome: " + name;
}
}
classe Autor
package Model;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
@Entity
@DiscriminatorValue("AUTOR")
public class Autor extends Usuario {
private String tipo;
private String descricao;
@OneToOne
@JoinColumn(name="time")
private Time time;
@OneToMany(mappedBy="autor", cascade = CascadeType.ALL)
private List<Postagem> postagens = new ArrayList<Postagem>();
@OneToMany(mappedBy="autor", cascade = CascadeType.ALL)
private List<Comentario> comentarios;
public Autor() {
}
public Autor(String name, String userName, String senha, String email) {
setName(name);
setUserName(userName);
setSenha(senha);
setEmail(email);
this.tipo = "autor";
}
public String getTipo() {
return tipo;
}
public void setTipo(String tipo) {
this.tipo = tipo;
}
public String getDescricao() {
return descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
public Time getTime() {
return time;
}
public void setTime(Time time) {
this.time = time;
}
public List<Postagem> getPostagens() {
return postagens;
}
public void addPostagem(Postagem p) {
postagens.add(p);
}
public void setPostagens(List<Postagem> postagens) {
this.postagens = postagens;
}
public List<Comentario> getComentarios() {
return comentarios;
}
public void setComentarios(List<Comentario> comentarios) {
this.comentarios = comentarios;
}
}
classe Time
package Model;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
@Entity
public class Time {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private String nomeDoTime;
@OneToMany(mappedBy="time", cascade = CascadeType.ALL)
private List<Autor> autores;
public Time() {
}
public Time(String nomeDoTime) {
this.nomeDoTime = nomeDoTime;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getNomeDoTime() {
return nomeDoTime;
}
public void setNomeDoTime(String nomeDoTime) {
this.nomeDoTime = nomeDoTime;
}
public List<Autor> getAutores() {
return autores;
}
public void setAutores(List<Autor> autores) {
this.autores = autores;
}
public String toString() {
return "Time: " + nomeDoTime;
}
}
andersonrc, tenta fazer essas alterações nas suas entidades.
@Entity
@DiscriminatorValue("AUTOR")
public class Autor extends Usuario {
private String tipo;
private String descricao;
// se de um lado é OneToMany, do outro é ManyToOne
@ManyToOne
@JoinColumn(name="time")
private Time time;
@Entity
public class Time {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private String nomeDoTime;
// faz tudo menos deletar.
@OneToMany(cascade = {CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE})
private List<Autor> autores;
private String tipo;
private String descricao;
@OneToOne
@JoinColumn(name="time")
private Time time;
Pode ser que funcione.
Abraço.
Schwingel