- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
简单的问题:有没有人知道如何在 hibernate
运行时 中通过 CascadeType.ALL
保护某些实体不被删除(可能抛出运行时异常)?
比如说,我们有一些实体:
@Entity
@Table(name = "FOO_ENTITY")
public class FooEntity {
...
}
我想保护它免受意外错误映射的影响,例如:
@Entity
@Table(name = "SOME_OTHER_FOO_ENTITY")
public class SomeOtherFooEntity {
...
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "FOO_ENTITY_ID")
private FooEntity fooEntity;
}
因此,应该可以通过 session.delete(fooEntityObj)
删除一些 FooEntity
类型的实体,但必须禁用通过级联删除删除它的能力(session.delete(someOtherFooEntityObj)
).
注意:对于那些不专心阅读我的问题或认为我不明白我在问什么的人:
1) 我无法删除 CascadeType.ALL
。问题是:谁的编程可以避免和保护它免受这种情况的影响?
2) 单元测试不是办法,我正在寻找运行时解决方案。
最佳答案
完成此操作的方法之一是以编程方式检查 Hibernate 映射元数据并检查是否有任何删除操作(ALL
、REMOVE
、orphanRemoval
) 从任何其他实体级联到 protected 实体;像这样的东西:
String protectedEntityName = FooEntity.class.getName();
SessionFactoryImpl sessionFactory = (SessionFactoryImpl) session.getSessionFactory();
for (EntityPersister entityPersister : sessionFactory.getEntityPersisters().values()) {
for (int i = 0; i < entityPersister.getPropertyTypes().length; i++) {
Type type = entityPersister.getPropertyTypes()[i];
EntityType entityType = null;
if (type.isCollectionType()) {
CollectionType collectionType = (CollectionType) type;
Type elementType = sessionFactory.getCollectionPersister(collectionType.getRole()).getElementType();
if (elementType.isEntityType()) {
entityType = (EntityType) elementType;
}
} else if (type.isEntityType()) {
entityType = (EntityType) type;
}
if (entityType != null && entityType.getName().equals(protectedEntityName)) {
if (entityPersister.getPropertyCascadeStyles()[i].doCascade(CascadingAction.DELETE)) {
// Exception can be thrown from here.
System.out.println("Found! Class: " + entityPersister.getEntityName() + "; property: " + entityPersister.getPropertyNames()[i]);
}
}
}
}
此验证可以在服务器启动时或在集成测试中执行。
这种方法的优点是您不必修改 Hibernate 的定义行为;它只是提醒您不要将删除级联到 FooEntity
。
关于测试,是的,我知道 OP 明确表示测试不是这个用例的可接受解决方案(我个人总体上同意)。但是这些类型的自动测试可能很有用,因为你写了它们然后忘记了它们;您不必在添加新映射或修改现有映射时更新测试(这违背了测试的目的,因为您可能会忘记或监督为每个可能的用例采用测试)。
关于java - 保护实体免受 Hibernate 中的级联删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31538902/
我是一名优秀的程序员,十分优秀!