无法在 http 会话中的休眠对象上使用 DataBinder

Posted

技术标签:

【中文标题】无法在 http 会话中的休眠对象上使用 DataBinder【英文标题】:Cannot use DataBinder on a hibernate object in the http session 【发布时间】:2013-06-27 03:45:35 【问题描述】:

我有一个会话属性,myForm 包含一些从数据库加载的 Hibernate 对象

@SessionAttributes("myForm")

我从我的控制器收到表单并像这样处理它

@RequestMapping(value = "/mymapping", method = RequestMethod.POST)
@ResponseBody
public final JsonValidationResponse validateContact(
        @ModelAttribute(value = "myForm") final MyForm myForm) 

    return jsonValidator.getJsonErrors(myForm.getContact());


Contact 类具有以下验证注释

@Email
private String email;

下面的方法有问题

    public final <T> JsonValidationResponse getJsonErrors(
            final T objectToValidate) 

        //TEST CODE HERE   

        DataBinder binder = new DataBinder(objectToValidate);
        binder.setValidator(validator);
        binder.validate();
        return getJsonErrors(binder.getBindingResult());
    

如果我观察 objectToValidate 我看到以下内容,我认为这是因为它是一个休眠对象并且正在使用 LAZY 初始化。

com.mypackage.Contact_$$_javassist_27@1bdbbc0[contactId=0,name=,email=,phone1=,phone2=,phone3=,version=0,createDate=,modifiedDate=,userId=]

如果我在 //TEST CODE HERE 的 objectToValidate 上运行 gettter,如下所示,我得到传入的正确值(例如“dummy”),如果在运行后我再次观察到“objectToValidate”,它甚至显示与上面相同的结果虽然它现在应该不再是 Lazy 初始化了。

String email = (Contact)objectToValidate.getEmail();

如果我在 //TEST CODE HERE 创建一个虚拟对象,代码可以正常工作,并且活页夹会发现错误。

    Contact dummy = new Contact();
    dummy.setEmail("dummy");

基本上 binder.getBindingResult() 在使用休眠对象时不会,我不知道如何修复它。它似乎无法解析 LAZY 初始化的休眠对象属性(即使在我调用对象上的方法并获得正确结果之后)。

【问题讨论】:

【参考方案1】:

如果你使用延迟初始化,那么休眠必须使用代理。这意味着objectToValidate 不是“真实”对象,它只是表现得像它。

在您的情况下,验证发生在字段级别。毕竟你已经注释了字段email而不是属性getEmail()

虽然我不能说你的情况到底发生了什么,但我可以说这与访问代理和直接访问字段之间的差异有关。我建议要么注释属性,要么不使用延迟初始化。

【讨论】:

以上是关于无法在 http 会话中的休眠对象上使用 DataBinder的主要内容,如果未能解决你的问题,请参考以下文章

从休眠中的会话中删除对象? [复制]

Vaadin 中的休眠会话错误

Spring Boot Data JPA:休眠会话问题

在 Grails 中,如何访问域类静态方法中的休眠会话?

视图中的休眠打开会话:每个请求的事务?

无法为事务打开休眠会话/无法打开连接 [关闭]