spring - 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>
请帮忙
解决方案
如果有帮助,问题是我在 MYSQL 5 数据库的 Hibernate 配置中声明了错误的方言。
hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect
推荐阅读
- reactjs - 无法让 Jest 运行命名导入
- python - 如何在 Windows 10 的 pyomo 的 SolverFactory 中使用“cbc”
- react-native - react-native 中的 BottomSheet 动画第一次无法正常工作
- react-native-ui-kitten - 选择时如何更改底部标签导航图标的颜色?
- java - 基于 Spring JPA 接口的投影在连接实体上返回 null
- xml - 解析 XML 时出现问题。带数字标签
- java - 在 ArrayList 中“合并”多个相同类型的元素
- sql - sql:在sql中相交(加入概率)
- angular - ReferenceError:未定义窗口:Angular 9
- assembly - NASM 警告:没有冒号的连续标签可能是一个错误