如何为String主键配置多对多关系?

时间:2018-05-03 15:19:37

标签: spring hibernate jpa

关注多对多关系的实体之一有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()

那么如何解决这个错误?

1 个答案:

答案 0 :(得分:0)

我想为那些遇到同样问题的人提供解决方案:来自@ crizzis的评论我实现了设置属性的有问题实体的构造函数:

public Structure(String code) {
    super();
    this.code = code;
}