我是Spring / Java EE的新手,我正在尝试一些教程。 我有两个实体类,User和UserType。 我想创建并保存用户。 UserType是创建表单中的下拉列表。 你能告诉我如何在用户创建过程中保存UserType吗?
(仅以下面的代码显示为例,它不完整) 如下所示,用户有一个名为UserType
的属性public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
@OneToOne
private UserType type;//one to one
}
public class UserType {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
}
//HTML code for the UserType dropdown
<select th:field="*{type}">
<option th:each="type : ${types}" th:text="${type.name}" th:value="${type.id}"></option>
</select>
//Controller save user code
user.setType(new UserType(Integer.parseInt(type), ""));
this.userRepo.save(user);
当我尝试运行此操作时,我收到“无法将类型'java.lang.String'的属性值转换为属性'type'错误所需的类型'UserType'。
使用上述关系保存实体的最佳方法是什么?如果您有任何资源可以学习,请分享。 非常感谢!
答案 0 :(得分:2)
您应该传递userType&#39; id
然后在service
或controller
中找到id
的userType并将其设置为user
。
UserType userType = userTypeRepo.find(Integer.parseInt(type));
//check userType!= null
user.setType(userType);
this.userRepo.save(user);
答案 1 :(得分:2)
带有type.id。你应该转换成真正的类型类(实体或dto),最佳实践 - 它使用DTO。 你可以通过mane方式将type.id转换为真实类型的对象。
简单案例(您使用它一两次):
//在控制器中
UserType userType = dao.getByTypeId(typeId); //通过id从db获取对象。 user.setType(用户类型);
更好的变体创建转换器 spring Coverter documentation (您不仅可以使用此转换器一次,它适用于所有控制器。一旦创建转换器,应用于许多地方)。 Converter获取type.id并按type.id
返回userType@Component public final class UserTypeConverter实现Converter { private long userTypeId; private UserTypeDao userTypeDao;
public LocalDateTimeConverter(Long userTypeId) {
this.userTypeId= userTypeId;
}
@Override
public UserType convert(Long userTypeId) {
if (userTypeId== null) {
return null;
}
return userTypeDao.findById(userTypeId);
}
}
PropertyEditor spring documentation与转换器的想法相同,但使用的情况略有不同:当您使用UserType作为String文本时。见
好的例子Spring From the Trenches: Using Type Converters With Spring MVC
简单示例 Spring MVC - Binding Java Backing Objects with Custom Converters