gpt4 book ai didi

java - 使用自己的注释更改查看实体 Bean 值的方式

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

我们有一些带有旧列的表,其中存储了 SpecialStrings。这些 SpecialString 不能为 NULL,而是等于某些 SPECIAL_UNICODE_NULL

因此,要通过 JAX-WS 将实体发送回客户端,我们必须实现整个实体包装器来发送它而不是实体,或者将转换逻辑显式添加到实体获取方法。

我们想要做的是使用我们自己的@LegacyString注释。

@Column(name="A_LEGACY_COLUMN")
@LegacyString
public String oneOfThenLegacyColumn;

然后在默认的实体监听器@PostLoad中,我们将使用适当的转换将所有@LegacyString字段转换为常规字符串。

但这种解决方案的问题是,在加载后修改实体后,实体被视为已更改,并且实体管理器将尝试将其更新到数据库。当然,我可以使用 @PreUpdate 方法来恢复更改。但我不确定这是否会阻止实体的真正更新。

所以问题是:如何通过自己的注释更改Entity Bean值View?

附注我深入了解了 ClassLoader,并将考虑在加载时间中添加更改的变体。但我找不到应用程序服务器类加载器案例的合理示例。

最佳答案

您可以通过创建您自己的 org.hibernate.usertype.UserType 实现来处理 Hibernate 中的此类特殊情况。

public class SpecialStringUserType implements UserType {

private static final int[] SQL_TYPES = { Types.VARCHAR };

public int[] sqlTypes() {
return SQL_TYPES;
}

public Class returnedClass() {
return String.class;
}

public boolean equals(Object x, Object y)
throws HibernateException {
if (x == y) {
return true;
} else if (x == null || y == null) {
return false;
} else {
return x.equals(y);
}
}

public Object nullSafeGet(ResultSet resultSet,
String[] names, Object owner)
throws HibernateException, SQLException {
String result = resultSet.getString(names[0]);
if ("SPECIAL_UNICODE_NULL".equals( result )) {
return null;
}
return result;
}

public void nullSafeSet(PreparedStatement statement,
Object value, int index)
throws HibernateException, SQLException {
if (value == null) {
statement.setString(index, "SPECIAL_UNICODE_NULL");
} else {
statement.setString(index, value);
}
}

public Object deepCopy(Object value) throws HibernateException {
return value;
}

public boolean isMutable() {
return false;
}
}

不要使用您自己的 @LegacyString 注释,而是执行以下操作:

@Column(name="A_LEGACY_COLUMN")
@Type( type = "SpecialStringUserType" )
public String oneOfThenLegacyColumn;

关于java - 使用自己的注释更改查看实体 Bean 值的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1070506/

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