java - 从 5.2.12 升级到 hibernate 5.3.4 后,Hibernate ColumnTransformer 停止工作

标签 java hibernate

我有一个实体类,其中一个字段用 @ColumnTransformer 注释

@NotNull
@Column(name = "CURRENCY_CODE_ID")
@ColumnTransformer(
   read = "(SELECT cc.code FROM currency_code AS cc WHERE cc.currency_code_id = currency_code_id)",
   write = "(COALESCE((SELECT cc.currency_code_id FROM currency_code AS cc WHERE cc.code = ?),0))")
public String currency;

在 hibernate 5.2.12 中它运行良好,但是在升级到 Hibernate 5.3.4.Final 之后它突然崩溃并且我正在生成以下查询

campaign0_.campaign_group_id as campaign3_33_,
(SELECT cc.code FROM public.currency_code AS cc 
    WHERE cc.campaign0_.currency_code_id = campaign0_.currency_code_id) as currency4_33_,
campaign0_.date_created as date_cre5_33_,

所以在 where 子句中 cc.currency_code_id = currency_code_id 被替换为 cc.campaign0_.currency_code_id 。所以基本上生成的表名 campaign0_ 被注入(inject)到表的别名和列名之间。不确定它是如何发生的以及解决方法是什么。我确实进行了搜索,但到目前为止一无所获。

迁移指南中也没有提到 - https://github.com/hibernate/hibernate-orm/blob/5.3/migration-guide.adoc

最佳答案

最后,经过大量调试和研究,我找到了为 5.* 版本系列报告的错误 - https://hibernate.atlassian.net/browse/HHH-8944?page=com.atlassian.jira.plugin.system.issuetabpanels%3Aall-tabpanel

看起来我必须使用 forColumn 配置,我试过了,它起作用了,但有点奇怪。从多个组合大写工作

 @NotNull
    @Column(name = "CURRENCY_CODE_ID")
    @ColumnTransformer(
            forColumn = "CURRENCY_CODE_ID",
            read = "(SELECT cc.code FROM currency_code AS cc WHERE cc.CURRENCY_CODE_ID = currency_code_id)",
            write = "(COALESCE((SELECT cc.currency_code_id FROM currency_code AS cc WHERE cc.code = ?),0))")
    public String currency;

如您所见,我将 forColumn = "CURRENCY_CODE_ID"添加为大写,并将 cc.CURRENCY_CODE_ID 引用为大写,因此它跳过了它。所以行为仍然有点古怪 m 但在列表中有效,

生成的结果是

 (SELECT
            cc.code 
        FROM
            public.currency_code AS cc 
        WHERE
            cc.CURRENCY_CODE_ID = campaign0_.currency_code_id) as currency4_33_,

这也有效,所以看起来像大写问题。女巫救了我

@NotNull
    @Column(name = "currency_code_id")
    @ColumnTransformer(
            forColumn = "currency_code_id",
            read = "(SELECT cc.code FROM currency_code AS cc WHERE cc.CURRENCY_CODE_ID = currency_code_id)",
            write = "(COALESCE((SELECT cc.currency_code_id FROM currency_code AS cc WHERE cc.code = ?),0))")
    public String currency;

关于java - 从 5.2.12 升级到 hibernate 5.3.4 后,Hibernate ColumnTransformer 停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51731829/

相关文章:

java - Hibernate 在事务开始函数时卡住

java - Hibernate:通过继承类的属性查询对象

java - 为什么我会收到 org.hibernate.id.IdentifierGenerationException?

java连接不上mysql数据库

java - Selenide:Allure 报告中缺少 @Step 注释

java - Controller 和 hibernate 集成。未保存实体

java - hibernate 跳过并采取一些行

java - 使用 Spring Security 处理远程身份验证

Java 闪烁图形

java - 复制 joda LocalTime 的直接方法是什么?