关注多对多关系的实体之一有String
Id
:
@Entity
@Table(name = "indicateur")
public class Indicateur {
@Id()
@SequenceGenerator(name="s_indicateur", sequenceName="s_indicateur", allocationSize=1)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="s_indicateur")
@Column(name = "indi_code")
private Long code;
@Column(name="indi_lib")
@Lob
private String lib;
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.MERGE)
@JoinTable(name = "resp_collecte_indicateur" , joinColumns = {@JoinColumn(name = "indi_code")} , inverseJoinColumns = {@JoinColumn(name = "struct_code")} )
@JsonManagedReference
private Set<Structure> responsables_collecte = new HashSet<Structure>();
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.MERGE)
@JoinTable(name = "resp_validation_indicateur" , joinColumns = {@JoinColumn(name = "indi_code")} , inverseJoinColumns = {@JoinColumn(name = "struct_code")} )
@JsonManagedReference
private Set<Structure> responsables_validation = new HashSet<Structure>();
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.MERGE)
@JoinTable(name = "resp_traitement_indicateur" , joinColumns = {@JoinColumn(name = "indi_code")} , inverseJoinColumns = {@JoinColumn(name = "struct_code")} )
@JsonManagedReference
private Set<Structure> responsables_traitement = new HashSet<Structure>();
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
@JoinTable(name = "acteur_saisie_indicateur" , joinColumns = {@JoinColumn(name = "indi_code")} , inverseJoinColumns = {@JoinColumn(name = "user_code")} )
private Set<Utilisateur> acteurs_saisie = new HashSet<Utilisateur>();
public Indicateur() {
super();
// TODO Auto-generated constructor stub
}
public Indicateur(Long code) {
super();
}
// getters and setters
}
@Entity
@Table(name = "structure")
public class Structure {
@Id()
@Column(name="struct_code")
private String code;
@Column(name="struct_lib")
private String lib;
@ManyToMany(fetch = FetchType.EAGER, mappedBy = "responsables_collecte")
@JsonBackReference
private Set<Indicateur> indicateursCollecte = new HashSet<Indicateur>();
@ManyToMany(fetch = FetchType.EAGER, mappedBy = "responsables_validation")
@JsonBackReference
private Set<Indicateur> indicateursValidation = new HashSet<Indicateur>();
@ManyToMany(fetch = FetchType.EAGER, mappedBy = "responsables_traitement")
@JsonBackReference
private Set<Indicateur> indicateursTraitement = new HashSet<Indicateur>();
public Structure() {
super();
}
public Structure(String code) {
super();
}
// getters and setters
}
我想在Indicur表中插入一条记录:
@Override
@Transactional
public void insert(Indicateur indicateur,
String[] responsable_collecte,
String[] responsable_validation,
String[] responsable_traitement ) {
Session sessionDynamic = Utils.createDynamicSession(env);
sessionDynamic.persist(indicateur);
if (responsable_collecte != null)
insertResponsable(indicateur, responsable_collecte, "collecte", sessionDynamic);
sessionDynamic.flush();
sessionDynamic.close();
}
@Transactional
private void insertResponsable(Indicateur indicateur, String[] struct_codes, String type, Session sessionDynamic) {
Set<Structure> structures = new HashSet<Structure>();
for(String s : struct_codes) {
if (!s.equals(""))
structures.add(structureDao.get(s));
}
if (structures != null && !structures.isEmpty()) {
if (type.equals("collecte"))
indicateur.setResponsables_collecte(structures);
else if (type.equals("validation"))
indicateur.setResponsables_validation(structures);
else if (type.equals("traitement"))
indicateur.setResponsables_traitement(structures);
}
sessionDynamic.merge(indicateur);
}
但是在运行时插入时我得到:org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save()
那么如何解决这个错误?
答案 0 :(得分:0)
我想为那些遇到同样问题的人提供解决方案:来自@ crizzis的评论我实现了设置属性的有问题实体的构造函数:
public Structure(String code) {
super();
this.code = code;
}