【问题标题】:Spring 4 JPA @Column bypasses setter functionSpring 4 JPA @Column 绕过 setter 函数
【发布时间】:2016-02-01 18:18:11
【问题描述】:

我有一个使用 Spring 4、JPA、Hibernate 和 MySQL 的工作程序,我正在将 JUnit 测试应用于该程序作为学习练习。

在实体类上我映射了一个字段:

@Column(name="processCode")
private String processCode = null;

public void setProcessCode(String code) { this.processCode = Utilities.setNotNull(code); }

(Utilities.java 包含一些辅助函数。setNotNull(String code) 类似于 "return (code == null) ? "" : code;")

当我通过内存创建一个对象时,一个空的“代码”会变成一个空白的 processCode:

myObject.setProcessCode(null);
"".equals(myObject.getProcessCode());  // eval true

当我通过JPA/Hibernate获取数据库记录,并且数据库中的字段为空值时,该字段为空。

myObject = manager.find(MyObject.class, 1L);
myObject.getProcessCode() == null;  // eval true

即DB获取代码直接填充私有属性processCode,我的setter没有被触发。

我可以强制 manager.find() 使用 setProcessCode() 函数吗?

谢谢, 杰罗姆。

【问题讨论】:

    标签: hibernate jpa spring-data


    【解决方案1】:

    您可以通过将 @Column(name="processCode") 定位在 getter 方法上而不是注释字段来做到这一点。

    默认情况下,您还必须在 getter 方法上使用其他映射注释,以使其正常工作(尤其是 @Id 注释)。

    【讨论】:

    • 这可行,但要小心。我有带下划线的列,例如“phone_number”。它在 HQL 中使用,例如“来自用户 u where u.phone_number like '...'”。当 Column 放置在属性上时,这可以正常工作。当 Column 在 getter 上时,我的 HQL 必须变为“来自用户 u where u.phoneNumber like '...'”。否则我会得到“QueryException:无法解析属性:phone_number ...
    猜你喜欢
    • 1970-01-01
    • 2020-03-19
    • 2017-05-26
    • 1970-01-01
    • 2020-07-23
    • 2021-03-26
    • 1970-01-01
    • 1970-01-01
    • 2013-10-13
    相关资源
    最近更新 更多