多对多的额外字段无法持久连接

时间:2018-09-17 21:16:12

标签: mysql transactions spring-data-jpa hibernate-mapping

我在持久性问题ManyToMany上有一个额外的字段,被困了一周。我使用JPA和Hibernate 5.2.17.Final作为提供程序,Spring boot 2.0.5.RELEASE。

这是我的实体:

@Entity
@Table(name = "personne",
    uniqueConstraints = {
            @UniqueConstraint(name = "nom_prenom_dateNaissance", columnNames = {"nom", "prenom", "date_naissance"})
    })
@Data
@XmlRootElement
@NoArgsConstructor
public class PersonneEntity
        implements Serializable
{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @NotNull(message = "Le nom de la personne ne peut etre null")
    @Column(nullable = false, length = 30)
    private String nom;

    @NotNull(message = "Le prenom de la personne ne peut etre null")
    @Column(nullable = false, length = 30)
    private String prenom;

    @NotNull(message = "Le sexe de la personne ne peut etre null")
    @Column(nullable = false, length = 1)
    private String sexe;

    @Column(length = 30)
    private String profession;

    @NotNull(message = "La ville de naissance de la personne ne peut etre null")
    @Column(name = "ville_naissance", nullable = false, length = 30)
    private String villeNaissance;

    @Column(name = "date_naissance")
    //@Past
    private Date dateNaissance;

    @OneToMany(mappedBy = "personne",
            cascade = CascadeType.ALL,
            orphanRemoval = true,
            fetch = FetchType.LAZY)
    @Valid
    private Set<LienParenteEntity> parents = new HashSet<>();

//    @OneToMany(mappedBy = "parent")
//    @Valid
//    private Set<LienParenteEntity> personnes = new HashSet<>();

    /**
     * add parente between Person and parent
     * @param parente
     * @param parent
     */
    public void addParente(String parente, PersonneEntity parent) {
        LienParenteEntity lienParenteEntity;

        lienParenteEntity = new LienParenteEntity(parente, this, parent);
        this.parents.add(lienParenteEntity);

        //parent.getPersonnes().add(lienParenteEntity);
    }

    /**
     * delete  parente between Person and Parent
     * @param parente
     * @param parent
     */
    public void deleteParente(String parente, PersonneEntity parent) {

        for(LienParenteEntity lienParenteEntity : this.parents) {

            if(StringUtils.equals(lienParenteEntity.getParente(), parente)){
                if(lienParenteEntity.getParent().equals(parent)){
                    lienParenteEntity.setPersonne(null);
                    this.parents.remove(lienParenteEntity);
                    break;
                }
            }
        }//for
    }
}

这是我的带有额外字段的joinTable

@Entity
@Table(name = "lien_parente")
@Data
@ToString(exclude = {"personne", "parent"})
@EqualsAndHashCode(exclude = {"personne", "parent"})
@XmlRootElement
@NoArgsConstructor
@RequiredArgsConstructor
public class  LienParenteEntity
        implements Serializable
{
//    @EmbeddedId
//    private LienParenteId id = new LienParenteId();

    @Column(nullable = false, length = 30)
    @NotNull(message = "La parente ne peut etre null")
    @NonNull
    private String parente;


    @Id
    @ManyToOne
    @JoinColumn(name = "personne_id")
    @NonNull
    private PersonneEntity personne;

    @Id
    @ManyToOne
    @JoinColumn(name = "parent_id")
    @NonNull
    private PersonneEntity parent;
}

这是我进入服务类的持久函数:

@Override
@Transactional( readOnly = false,
            propagation = Propagation.REQUIRED,
            rollbackFor = Exception.class)

    public void insert(PersonneDto dto) {

        String parente;
        List<PersonneDto> parentDtos;
        PersonneEntity personneEntity;
        PersonneEntity parentEntity;

        personneEntity = this.personMapper.asEntity(dto);

        for(Iterator<String> it = dto.getParents().keySet().iterator(); it.hasNext();) {
            parente = it.next();
            parentDtos = dto.getParents().get(parente);

            //First -> persist Parent into DB
            //Second -> add Parent persisted in Personne
            //Third -> persist Personn so persist LienParenty cause Cascade
            for(PersonneDto parentDot : parentDtos) {
                parentEntity = this.personMapper.asEntity(parentDot);
                this.personneDao.save(parentEntity);
                personneEntity.addParente(parente, parentEntity);

                log.debug("{}", parentEntity.toString());
            }//for
        }//for

        this.personneDao.save(personneEntity);

        log.debug("{}", personneEntity.toString());
    }

我在DBunit上使用Junit测试了我的服务

@Test
    @ExpectedDatabase(assertionMode = DatabaseAssertionMode.NON_STRICT, value = "/dataset/personne/expectedPersonne.xml")
    @ExpectedDatabase(assertionMode = DatabaseAssertionMode.NON_STRICT, value = "/dataset/personne/expectedLien_parente.xml")
    public void testInsert(){

...    
         this.service.insert(personne);

    }

我看到休眠状态可以正确地将我的两个PersonneEntity持久保存到Table Personne中,如以下日志所示:

[DEBUG] org.hibernate.SQL.logStatement - insert into personne (date_naissance, nom, prenom, profession, sexe, ville_naissance) values (?, ?, ?, ?, ?, ?)

...

[DEBUG] org.hibernate.SQL.logStatement - insert into personne (date_naissance, nom, prenom, profession, sexe, ville_naissance) values (?, ?, ?, ?, ?, ?)

但是可联合的LienParenteEntity不会持久。

你能帮我吗?

Thx

0 个答案:

没有答案
相关问题