gpt4 book ai didi

java - 尽管 autoApply=false 并且属性未使用 @Convert 注释,但仍应用 JPA 属性转换器

转载 作者:行者123 更新时间:2023-12-02 02:25:35 24 4
gpt4 key购买 nike

我正在开发的系统有一堆遗留数据,其中 boolean 值已存储为 'Y''N'。新表使用 BIT 列,并仅存储 01。没有表格混合这两种方法。

为了支持旧表,我们有以下转换器:

@Converter(autoApply = false)
public class BooleanToStringConverter implements AttributeConverter<Boolean, String> {

private Logger.ALogger Log = Logger.of(BooleanToStringConverter.class);

@Override
public String convertToDatabaseColumn(final Boolean attribute) {
Log.debug("Converting the boolean value {}", attribute);

if (attribute == null) {
return "N";
}

return attribute ? "Y" : "N";
}

@Override
public Boolean convertToEntityAttribute(final String dbData) {
return "Y".equalsIgnoreCase(dbData);
}

}

由于这只需要应用于某些实体,因此 autoApply 属性已设置为 false。

我现在正在创建一个带有新表的全新实体。它有两个 boolean 属性,都使用 BIT 列样式而不是 Y/N:

@Entity
@Table(name = "MyEntity")
public class MyEntity {

@Id
@Column(name = "MyEntityId")
private Long id;

@Column(name = "IsClosed")
private Boolean closed;

...
}

请注意,我尚未应用 @Convert 注释。

我有一个查询需要过滤掉实体关闭的任何行:

query.where().eq(CLOSED, Boolean.FALSE)

正是在这一点上我的问题出现了。每当运行此查询时,我都会看到来自 BooleanToStringConverter 的日志消息被写入日志,事实上,如果我转储从 MySQL 数据库执行的实际 SQL,那么我可以看到转换器实际上已应用于 boolean 属性,创建以下 SQL 片段:

select <columns>
from MyEntity t0
where <other predicates>
and t0.IsClosed = 'N'
order by <order clause>

这显然是错误的 - 转换器不应该被应用,它没有设置为自动,并且关闭的属性没有用 @Convert 注释。

我尝试通过创建第二个转换器来解决这个问题:

@Converter(autoApply = true)
public class BooleanConverter implements AttributeConverter<Boolean, Boolean> {

private Logger.ALogger Log = Logger.of(BooleanConverter.class);

@Override
public Boolean convertToDatabaseColumn(final Boolean attribute) {
Log.debug("Processing the value {}.", attribute);
return attribute;
}

@Override
public Boolean convertToEntityAttribute(final Boolean dbData) {
return dbData;
}
}

这导致两个转换器都应用于该属性,并且我看到两个调试语句都出现在日志中。

2019-07-29 14:19:53,994 [dispatcher-69] DEBUG BooleanConverter     Processing the value false.
2019-07-29 14:19:53,994 [dispatcher-69] DEBUG BooleanToStringConve I'm Converting the boolean value false

接下来,我尝试显式设置要在实体本身上使用的转换器(我希望这可能会改变应用转换器的顺序,以便尽管其他转换器正在运行,但它最终会成为 true/false):

@Entity
@Table(name = "MyEntity")
public class MyEntity {

@Id
@Column(name = "MyEntityId")
private Long id;

@Convert(converter = BooleanConverter.class)
@Column(name = "IsClosed")
private Boolean closed;

...
}

结果完全相同;两个转换器都按顺序应用于值,BooleanToStringConverter 笑到了最后并破坏了谓词。

我宁愿保留 BooleanToStringConverter 因为它可以让处理遗留数据变得不那么痛苦,但除非我能弄清楚为什么它不应该被应用,否则看起来我很可能会'必须删除它。

我正在使用 Ebean 版本 4.1.3 并 Play ! 2.6.21

我怎样才能阻止这个流氓转换器将自己应用到它无权接触的属性上?

最佳答案

这是(现在)已知的 Ebean 限制,如 Issue 1777 中所述。在 Ebean 的 GitHub 页面上。在撰写本文时,尚未计划修复此问题。

关于java - 尽管 autoApply=false 并且属性未使用 @Convert 注释,但仍应用 JPA 属性转换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57256093/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com