gpt4 book ai didi

java - 保护实体免受 Hibernate 中的级联删除

转载 作者:行者123 更新时间:2023-11-29 05:02:40 26 4
gpt4 key购买 nike

简单的问题:有没有人知道如何在 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 映射元数据并检查是否有任何删除操作(ALLREMOVEorphanRemoval ) 从任何其他实体级联到 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com