gpt4 book ai didi

java - Hibernate 数据映射到子对象

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:51:34 32 4
gpt4 key购买 nike

我正在尝试弄清楚如何将根据请求传入的数据映射到 Hibernate 对象,问题是传入的数据可能位于对象或子对象上,而字段数据不一定已知 - 表单由用户配置为包含和收集所需数据。

大致来说,对象是这样的:

Job {
String title;

@ManyToOne
@JoinColumn(name = "location_id")
JobLocation location;
}

JobLocation {
int id;
String description;
double latitude;
double longitude;
}

因此,如果用户已定义他们想要编辑 JobLocation 描述,我们将在请求中返回类似以下内容的内容

{ jobLocationDescription: 'Santa Fe' }

如何将它映射回我正在处理的 Job 的子级?我在保存时所拥有的只是对 Job 的引用,所有其他项目可能会有所不同,具体取决于他们在下拉列表中选择的内容等。一种选择是存储诸如 job 之类的引用.location.description,并有 getters 并使用反射来做一个进程驱动选项:

String[] field = requestField.split(".");
Entity ent = (get object from field[0]);
if (field.length > 2) {
ent = ent.get[get method name from next field position]();
}
ent.set[get method name from last field[] value](requestValue);

遗憾的是,没有人说它不能是多层次的,要获得我们目前认为的方法,我们必须使用反射。是否有其他更好的方法来执行此类操作,还是我们只需要努力完成它?

最佳答案

我在我们的项目中有几乎相似类型的需求。我们最终使用反射 + 注释进行映射。简而言之,我们有类似这样的东西来构造对象。

class Job {
String title;

@ManyToOne
@JoinColumn(name = "location_id")
@EntityMapper(isRef="true")//Custom Annotation
JobLocation location;
}

class JobLocation {
@EntityMapper(fieldName="jobLocationId")
int id;
@EntityMapper(fieldName="jobLocationDescription")//Custom Annotation
String description;
double latitude;
double longitude;
}

如果您不明白我的意思,我们创建了自定义注释并编写了一个实用方法,该方法通过反射循环遍历具有注释的元素,如下所示:

for (Field field : object.getClass().getDeclaredFields()) {
//check for the EntityMapper annotation
if (field.getAnnotation(EntityMapper.class) != null) {
.
.
.//Use more reflection to use getters and setters to create and assign values from the JSON request.
}
}

关于java - Hibernate 数据映射到子对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31658701/

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