Olha só pessoal… estou enfrentando problemas no hibernate. Por favor leiam atentamente pois o problema é bem espeífico.
Tenho três classes: Phase (A), Iteration (B) e Activity ©
tenho 4 tabelas: tabelas de phase, iteration e activity + a tabela iterationactivity (relacionamento ManyToMany)
vejam como está organizada:
A -> @OneToMany com B que por sua vez eh @ManyToOne com A
e B é @ManyToMany com C
daí faço as seguintes relações:
A -> B -> C (A se relaciona com B q se relaciona com C)
Não se preocupem com os nomes das tabelas e atributos descritas na classe…
Ai na tabela ou ele apaga a ligação de A e B ou ele apaga a ligação de B com C
depende da ligação que eu fizer primeiro
ai ja descobri o erro…
como a ligação @ManyToMany entre B e C esta definida como @ManyToMany(fetch = FetchType.LAZY) , qndo ele vai salvar a ligação de A com B (vamos supor que ele ja salvou no banco a ligação de B com C) ele não tem carregado a lista de objetos do tipo C da classe B, ou seja, a lista de objetos C está nula. Como consequencia, o hibernate faz a associacao de A -> B e apaga a associacao B -> C, pois teoricamente B nao possui elementos na lista de objetos C. Pelo que eu li, teria que mudar o FetchType de LAZY para EAGER… pois isso permite que ele carregue a lista inteira de B (quando for feita a associação com A) daí ficaria A -> B -> C
mas ai ele dá um erro:
Error connect to the database
org.hibernate.HibernateException: cannot simultaneously fetch multiple bags
Segue abaixo as classes (A corresponde a Phase, B corresponde a Iteration e C corresponde a Activity no exemplo)
@Entity
@Table(name = "pe_phase", schema = "transforms")
public class Phase extends EntityModel {
@Id
@Column(name = "int_id_PE_Phase")
private long id;
@Column(name = "vchr_description")
private String description;
@Column(name = "int_temporalOrder")
private int order;
@Column(name = "vchr_type")
private String type;
@OneToMany(mappedBy = "phase", fetch = FetchType.EAGER)
private List<Iteration> iteration;
@Entity
@Table(name = "pe_iteration", schema = "transforms")
public class Iteration extends EntityModel {
@Id
@Column(name = "int_id_PE_Iteration")
private long id;
@Column(name = "int_number")
private int number;
@ManyToOne
@JoinColumn(name = "PE_Phase_int_id_PE_Phase")
@Fetch(FetchMode.JOIN)
private Phase phase;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "pe_iterationactivity", schema = "transforms", joinColumns = @JoinColumn(name = "PE_Iteration_int_id_PE_Iteration"), inverseJoinColumns = @JoinColumn(name = "PE_Activity_int_id_PE_Activity"))
private List<Activity> activities;
@Entity
@Table(name = "pe_activity", schema = "transforms")
public class Activity extends EntityModel {
@Id
@Column(name = "int_id_PE_Activity")
private long id;
@Column(name = "vchr_activity")
private String description;
@ManyToOne
@JoinColumn(name = "PE_ProcessRole_int_id_PE_ProcessRole")
@Fetch(FetchMode.JOIN)
//@Cascade(CascadeType.SAVE_UPDATE)
private ProcessRole processRole;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "pe_iterationactivity", schema = "transforms", joinColumns = @JoinColumn(name = "PE_Activity_int_id_PE_Activity"), inverseJoinColumns = @JoinColumn(name = "PE_Iteration_int_id_PE_Iteration"))
private List<Iteration> iterations;
Espero que possam me ajudar, desde já agradeço
Alabê Duarte