【问题标题】:hibernate validation not working while one-to-one mapping in between two entities在两个实体之间进行一对一映射时,休眠验证不起作用
【发布时间】:2018-11-08 19:30:21
【问题描述】:

在表单提交期间,如果有任何验证错误,则表单会在字段下显示错误消息。但实际的问题在另一个地方。我有两个实体 UserUserDetails。这些实体通过双向一对一映射相互映射。验证仅适用于 User 实体字段,但不适用于 UserDetails 实体。

春季 - 5.0.2` 休眠 - 5.2.10

User.java

@Entity
@Table(name="users")
public class User {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;

@NotEmpty(message="{common.error.msg}")
private String first_name;

@NotEmpty(message="{common.error.msg}")
private String last_name;

@NotEmpty(message="{common.error.msg}")
private String status;

@OneToOne(cascade = CascadeType.ALL, mappedBy = "user", fetch = FetchType.LAZY)
private UserDetails userDetails;

//Getter and setter methods
}

UserDetails.java

@Entity
@Table(name="user_details")
public class UserDetails {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int user_id;

@NotEmpty(message="{common.error.msg}")
private String address;

@NotEmpty(message="{common.error.msg}")
private String mobile;

@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "id")
private User user;

//Getter and setter methods
}

控制器类中的Get和Post方法

@GetMapping(value="/create")
public String loadUserForm(Model model) {
    model.addAttribute("command", new User());
    return "backend/oms/user/form";  //JSP
}

@PostMapping(value="/create")
public String Save(@Valid @ModelAttribute("command") User user, BindingResult br, Model model, HttpSession session, RedirectAttributes ra) {
    if(br.hasErrors()) {
        return "backend/oms/user/form"; //JSP
    } else {
        try {
            int id = userService.save(user);
            if(id > 0) {
                ra.addFlashAttribute("flash_msg", "ok|User added!");
                return "redirect:/oms/user/edit/"+id;
            } else {
                return "backend/oms/user/create"; //JSP
            }
        } catch (ConstraintViolationException ex) {
            model.addAttribute("err", "Something wrong! Please try again.");
            return "backend/oms/user/form"; //JSP
        }
    }
}

messages.properties

common.error.msg=This field is required!

form.jsp

<form:form action="/oms/user/create" method="post" modelAttribute="command">
     <label>First Name</label>
     <form:input path="first_name" class="form-control" placeholder="First Name" value="" />
     <form:errors cssClass="error" path="first_name" />

     <label>Last Name</label>
     <form:input path="last_name" class="form-control" placeholder="Last Name" value="" />
     <form:errors cssClass="error" path="last_name" />

     <label>Mobile</label>
     <form:input path="userDetails.mobile" class="form-control" placeholder="Mobile" value="" />
     <form:errors cssClass="error" path="userDetails.mobile" />

     <label>Address</label>
     <form:textarea path="UserDetails.address" class="form-control" placeholder="Address" value="" />
    <form:errors cssClass="error" path="userDetails.address" />

    <label>Status</label>
    <form:select class="form-control" path="status">
       <option value="">Choose...</option>
       <option value="E">Enable</option>
       <option value="D">Disable</option>
    </form:select>
    <form:errors path="status" cssClass="error"/>

    <input type="submit" class="btn btn-primary" value="Save" />

</form>

Please see the screenshot 如您所见,仅来自 User 实体的图像字段正在验证,但来自 UserDetails 的字段未验证。请帮忙。

【问题讨论】:

  • 我现在解决了。 @Valid 注解解决了我的问题。

标签: spring hibernate validation one-to-one


【解决方案1】:

现在解决了。 @Valid 注释解决了我的问题。我需要在实体变量声明之前添加@Valid 注释,如下所示--

@OneToMany(mappedBy="majorHead", cascade = CascadeType.ALL)
@Valid
private List<MinorHead> minorHead = new ArrayList<MinorHead>();

【讨论】:

    猜你喜欢
    • 2021-11-11
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    • 2015-11-25
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    相关资源
    最近更新 更多