gpt4 book ai didi

java - 如何仅发送 @ManyToMany hibernate 表中的 id?

转载 作者:行者123 更新时间:2023-12-02 09:38:06 24 4
gpt4 key购买 nike

我正在创建一个网站,当用户创建个人资料时,他们会提交他们所知道的语言。这些语言是从数据库中名为 languages 的表中获取的,该表有 2 列 id 和 name。我使用复选框来显示数据库中可用语言的列表,如下所示......

<label for="languages_spoken">Select the languages you can speak in:</label>
<div id="languages_spoken" th:each="language : ${supportedLanguages}">
<input type="checkbox" name="languagesSpoken" th:value="${language}">
<label th:text="${language.name}"></label>
</div>

现在,在服务器端,我想将所选语言存储到用户配置文件表的数据库中。所以我创建了一个配置文件@Entity注释类,它有一个语言字段以及getter和setter,如下所示:

@Entity
public class Profile {
...
@ManyToMany
private List<Language> canSpeak;
...
public List<Language> getCanSpeak() {
return canSpeak;
}
public void setCanSpeak(List<Language> canSpeak) {
this.canSpeak = canSpeak;
}
...
}

现在的问题是,服务器收到的请求的所有内容都是字符串格式。因此,在 setCanSpeak(List canSpeak) 方法中,它接收 String[] 类型的参数,因此抛出错误

我决定解决这个问题,不需要将整个对象作为 th:value 发送回来,因为它只会存储用户选择的语言的 id,所以我尝试了这个...

<label for="languages_spoken">Select the languages you can speak in:</label>
<div id="languages_spoken" th:each="language : ${supportedLanguages}">
<input type="checkbox" name="languagesSpoken" th:value="${language.id}">
<label th:text="${language.name}"></label>
</div>

并将配置文件实体字段从语言列表更改为整数列表,因为语言的 id 类型为整数。

但是当我向该字段添加 @ManyToMany 注释时,它抛出了异常,因为 Integer 不是我的项目中的实体。

org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class:

最佳答案

好吧,这里发生了一些事情。您只需要保存整数这一事实并不意味着您需要将实体模型对象更改为 List<Integer> .

您仍然需要保存语言对象列表:List<Language>

所以,我不知道你如何处理你的请求,但我很确定你需要做这样的事情:

  1. 在 servlet 或 Controller 中获取数据请求
  2. 调用您的持久方法并创建您需要的所有Language对象,仅设置每个对象的ID 属性
  3. 将所有对象放入 List<Language>
  4. 将该列表设置为您的 Profile entity
  5. 保留您的个人资料实体

也许代码示例会给您一个更好的想法(假设这是您的持久逻辑,并且 RequestData 是一个包含您需要持久的所有信息的对象):

void persist(RequestData data) {
...
// you need to persist a Profile, so set all of your info:
Profile profile = new Profile();
profile.setX(...);
profile.setY(...);

// then you need to save languages selected by user only by ID, so:

List<Integer> ids = data.getListOfIds(); // get your data
List<Language> languages = new ArrayList<Language>(); // create your objects

// create and set a list of languages
for(Integer i : ids) {
Language l = new Language();
l.setId(i);
languages.add(l);
}

profile.setLanguages(languages);

// finally persist your profile object using whatever approach you need
// example: em.save(profile);
}

关于java - 如何仅发送 @ManyToMany hibernate 表中的 id?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57329401/

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