pesquisei, pesquisei e nada. Resolvi postar meu problema:
Tenho duas classes: Pessoa e Departamento. No banco tenho ainda a tabela pessoa_departamento que guarda as chaves das duas tabelas, onde pessoa tem vários departamentos e departamentos tem várias pessoas.
Vou postar o meu código (somente o que interessa);
Pessoa:
[code]@Entity @Table(name = “pessoa”, uniqueConstraints = {})
public class Pessoa implements Serializable {
/** Código da pessoa */
@Id
@GeneratedValue (strategy=GenerationType.IDENTITY)
@Column(name="PesCodigo")
private int codigo;
/** Nome */
@Column(name="PesNome")
private String nome;
/** Departamentos */
@ManyToMany(mappedBy="pessoaList", cascade=CascadeType.ALL)
private List<Departamento> departamentoList;
//continua...[/code]
Classe Departamento
[code]@Entity @Table(name = “departamento”, uniqueConstraints = {})
public class Departamento implements Serializable {
/** Código do departamento */
@Id
@GeneratedValue (strategy=GenerationType.IDENTITY)
@Column(name="DepCodigo")
private int codigo;
/** Nome */
@Column(name="DepNome")
private String nome;
@ManyToMany
@JoinTable(name="pessoa_departamento",
joinColumns=
@JoinColumn(name="PedDepCodigo", referencedColumnName="DepCodigo"),
inverseJoinColumns=
@JoinColumn(name="PedPesCodigo", referencedColumnName="PesCodigo")
)
private List<Pessoa> pessoaList;
//continua ...[/code]
Problema:
Preencho um objeto pessoa com todos os atributos, inclusive seu list de departamentos, quando vou dar um merge, os dados de pessoa mudam, mas os relacionamentos com departamento não são inseridos!!!
Acontece que a sua tabela pessoa_departamento é uma tabela unida sem primary key, então o hibernate a mapeia com as anotações JoinTable em uma das duas classes envolvidas e esta será responsável pelas operações CRUD, no seu caso aí, a classe pessoa só consultara esta tabela. Por isso coloquei o cascadeType no Departamento.
Qq dúvida posta aê…
Por que criar mais uma classe Guerr@, se teoricamente o hibernate controlaria isso para mim.
Tem alguma coisa a ver com performance?[/quote]
Eu ainda não consegui fazer funcionar o hibernate com a exclusão em cascata muitos para muitos. Ele sempre exclui o outro lado, pois ele exclui registro da tabela de relacionamento mais o da outra tabela. Criando uma classe no meio você consegue ter um controle mais fino dos dois lados do relacionamento, pedindo para ele excluir um mas não o outro.
Cara fiquei com isso na cabeça, pois me recordava de já ter implementado este tipo de situação há um tempo atrás, sem ter tido maiores problemas. Bom, agora que eu tive um tempo dei uma olhada aqui na minha máquina e me lembrei.
Vamos imaginar a seguinte situação:
Tenho as tabelas Usuario, Rotina, e a união destas duas Usuario_Rotina. Na tabela Usuario_Rotina tenho apenas as chaves primárias das outras duas, onde a chave primária da tabela Usuario é a primeira coluna e a chave da Rotina é a segunda. Então, respeitando esta ordem, eu coloquei os mapeamentos @JoinTable,… Cascade=CascadeType.ALL… na classe Usuario.java, na classe Rotina.java eu coloquei apenas uma lista de usuarios com a anotação @ManyToMany. No cadastro de Usuarios do meu sistema eu apenas seto a collection de rotinas e dou um persist, funciona blz. Ah, se eu der delete, ele vai apagar apenas os dados na tabela Usuario_Rotina, não apagando os dados na tabela Rotina, como vc havia comentado que estava acontecendo com vc. Bom, a minha hipótese para a ordem das chaves estrangeiras ser relevante se dá pelo fato do hibernate usar reflection e (opniao minha) ler sequencialmente a classe Java.