Spring MVC:如何发布相关的实体对象并保存在DB中?

时间:2017-06-17 09:26:04

标签: java spring-mvc jpa spring-boot thymeleaf

我是Spring / Java EE的新手,我正在尝试一些教程。 我有两个实体类,User和UserType。 我想创建并保存用户。 UserType是创建表单中的下拉列表。 你能告诉我如何在用户创建过程中保存UserType吗?

  1. 我应该将其作为UserType对象传递吗?
  2. 我应该只传递UserType的id(整数)吗?
  3. (仅以下面的代码显示为例,它不完整) 如下所示,用户有一个名为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'。

    使用上述关系保存实体的最佳方法是什么?如果您有任何资源可以学习,请分享。 非常感谢!

2 个答案:

答案 0 :(得分:2)

您应该传递userType&#39; id然后在servicecontroller中找到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转换为真实类型的对象。

  1. 简单案例(您使用它一两次):

    //在控制器中

    UserType userType = dao.getByTypeId(typeId); //通过id从db获取对象。 user.setType(用户类型);

  2. 更好的变体创建转换器 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);
    }
    

    }

  3. PropertyEditor spring documentation与转换器的想法相同,但使用的情况略有不同:当您使用UserType作为String文本时。见

  4. 好的例子Spring From the Trenches: Using Type Converters With Spring MVC

    简单示例 Spring MVC - Binding Java Backing Objects with Custom Converters