gpt4 book ai didi

java - Hibernate 检查删除约束

转载 作者:太空宇宙 更新时间:2023-11-04 07:33:11 25 4
gpt4 key购买 nike

我正在使用 Spring - Hibernate 来控制应用程序中的模型。这些模型是相互链接的(一对多、多对多、几乎各种关系),现在我在删除一个正在被其他实体使用的实体时遇到问题。问题是我想显示详细消息,准确告知其他对象(类型、名称)正在使用我要删除的实体。这不是 Hibernate 向我抛出的关于违反约束的常见消息。
例如:汽车 --> 人、房子 --> 人;那么当我删除一个拥有汽车和房子的人时,该消息将显示“有与此人链接的汽车(名为福特野马)和房子(名为MyHouse)”。
1. 那么Hibernate有没有方法支持这个需求呢?我猜这个特定要求没有实现。
2.如果没有任何实用程序可以解决此问题,我正在考虑以下解决方案:
- 在每个实体类(即 Person)中,我将定义所有检测从该实体到其他实体的链接的检查方法,例如:

class Person {
// Properties
// Checking methods, return type and name of linked objects
public Map<String, String> getLinkedCars() {
// Query to DB to get linked cars
// return a Map contain Class name along with object name <Car, Ford Mustang>
}

public Map<String, String> getLinkedHouses() {
// Query to DB to get linked houses
// return a Map contain Class name along with object name <House, MyHouse>
}
}

-然后,在删除 Person 实体之前的服务中,我将使用反射机制来收集检查方法(其名称以“getLinkedXXX”开头)的结果,并构建详细的错误消息。
那么这个解决方案好不好呢?关于MVC的性能和约定(因为我必须在模型类中查询数据)?
感谢您的帮助。

最佳答案

一种(不是那么简单)的方法是扫描实体类中的 @OneToMany@ManyToMany 带注释的字段并执行检查,以便可以向用户提供简洁的错误消息。以下示例代码假设您仅注释字段,而不注释 getters 方法,例如:

public class Person {
@OneToMany(..)
private List<House> houses;
//...
}

首先使用反射获取所有字段的列表:

Fields[] fields = Person.class.getDeclaredFields();

然后迭代并检查 @OneToMany@ManyToMany 注释

for(Field f : fields) {
if( f.getAnnotation(OneToMany.class) != null ||
f.getAnnotation(ManyToMany.class) != null) {
// Here you know f has to be checked before the person is deleted ...
}
}

可以使用以下方式获取特定人员对象的字段值:

Person p = // fetch a person ..
Field f = // assume f is the "List<House> houses" field
List<House> houses = (List<House>) f.get(p);

关于java - Hibernate 检查删除约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17392207/

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