Как настроить отношение «многие ко многим» для первичного ключа строки? - PullRequest
0 голосов
/ 03 мая 2018

Одна из сущностей, которая связана с отношением «многие ко многим», имеет 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

}

Я хочу вставить запись в таблицу индикаторов:

@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 голосов
/ 04 мая 2018

Я хочу поставить здесь решение для тех, кто сталкивается с той же проблемой: из комментария @ crizzis я реализовал конструктор проблемного объекта, в котором я установил атрибут:

public Structure(String code) {
    super();
    this.code = code;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...