首页 > 解决方案 > Hibernate 不会删除 Parent oneToMany 关系

问题描述

自从我阻止使用 JPA 和 HibernateProvider 的级联删除父实体和子实体以来已经有几天了。我读了很多关于这个主题的文章,但我读到的内容对我来说不起作用。

1/ 我的父 UtilisateurEntity,使用 cascade、lazy 和 orphanRemoval,以及 Child RoleEntity,使用

@Entity(name = "UtilisateurEntity")
@Table(name = "utilisateur",
    uniqueConstraints = {
            @UniqueConstraint(name = "login", columnNames = "login")})
@XmlRootElement
public class UtilisateurEntity implements Serializable {

    // skipped attributes for the post

    **@OneToMany( mappedBy = "utilisateur", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)**
    private List<RoleEntity> roles = new ArrayList();

    //skip Constructor and getters/setters

    public void addRole(RoleEntity roleEntity){
      roleEntity.setUtilisateurEntity(this);
      this.roles.add(roleEntity);
    }

    public void deleteRole(RoleEntity roleEntity){
       this.roles.remove(roleEntity);
       roleEntity.setUtilisateurEntity(null);
    }

    //skip equals and hashCode
}

@Entity(name = "RoleEntity")
@Table(name = "role",
    uniqueConstraints = {
            @UniqueConstraint(name = "role_utilisateurId", columnNames = {"role", "utilisateurId"})
    })
@XmlRootElement
public class RoleEntity implements Serializable {

    // skipped attributes for the post

    @ManyToOne
    @JoinColumn(name = "utilisateurId", nullable = false)
    private UtilisateurEntity utilisateur;

    //Skip Constructors, getters setters, equas and hashCode
}

2/我对businnes bean使用spring和注释配置,对基础设施bean使用xml配置(数据源、事务、entitimanagerFactory、jpaVendorAdapter)。我使用 JPA 将持久性数据倒入 MYSQL 数据库并像 jpa 提供程序一样休眠。

3/ 我使用maven,我的应用分为几个maven子模块,一个用于服务(业务),一个用于dao,一个用于实体,一个用于批处理,一个用于基础架构(AOP,事务,...),一个对于 web 应用程序。每个子模式都有自己的弹簧配置。我使用 Dto 模式,意味着每个子模块管理自己的对象模型(DAO 子模块的实体,服务子模块的 dto)。Selma 映射器在两个对象之间构建转换。

3/Service utilisateur 使用 dao 来创建和删除 utilisateur 和自己的角色。

@Service("utilisateurService")
public class UtilisateurServiceImpl implements IUtilisateurService{
    @Autowired
    private IUtilisateurDao utilisateurDao;
    @Autowired
    private IUtilisateurMapper utilisateurMapper;
    @Autowired
    private PasswordEncoder passwordEncoder;

    //skipped

    @Override
    public void delete(String login){

       UtilisateurEntity entity;

       entity = this.utilisateurDao.findByLogin(login);
       this.utilisateurDao.delete(entity);
    }
}

@Repository("utilisateurDao")
public class UtilisateurDaoImpl implements IUtilisateurDao
{

    ....

    @Override
    public void delete(T entity)
    {
        this.entityManager.remove(entity);
    }

    ....
}

问题:当我像这样创建或更新 UtilisateurEntity 时:this.utilisateurService.create(dto) 它会将我的新 UtilisateurEntity 创建到 Mysql DB 中。该函数使用映射器从 DTO 转换为 ENTITY 和 DAO 持久保存到 DB 没有问题。

但是当我删除父实体时,UtilisateurEntity 就像这样:this.utilisateurService.delete(dto); 此调用表明该函数通过登录查找实体是正确调用的。该实体已被退回。之后调用utilisateurDao(entity); 没有给出错误,但是实体Parent和Child,所以UtilisateurEntity和她的RoleEntity没有被删除到Mysql DB中。

我认为问题是事务弹簧配置,但我没有看到错误。

<tx:advice id="serviceTxAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="find*" read-only="true"/>
        <tx:method name="*" rollback-for="java.lang.Exception"/>
    </tx:attributes>
</tx:advice>
<aop:config>
    <aop:pointcut id="serviceTxPointCut"
                  expression="execution(* com.hsmr.genealogie..*ServiceImpl.*(..))"/>
    <aop:advisor advice-ref="serviceTxAdvice" pointcut-ref="serviceTxPointCut"/>
</aop:config>

请帮忙

标签: springhibernatejpa

解决方案


如果有帮助,问题是我在 MYSQL 5 数据库的 Hibernate 配置中声明了错误的方言。

hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect

推荐阅读