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

标签 java jpa jakarta-ee ejb-3.0

我们有一些带有旧列的表,其中存储了 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/

相关文章:

java - 如何删除错误 UnsupportedOperationException 和可能的内存泄漏

java - Jackson 将属性序列化并包装到一个新对象中

java - Hibernate计算集合@Formula

hibernate - 交易期间版本不增加

JPA将列表传递给命名 native 查询中的IN子句

java - 我需要 Web/JavaEE 容器中的线程来完成同一 JVM 中的 AsyncContext 对象

jakarta-ee - 如何在 Oracle JRE 中跟踪方法 System.gc()

java - Solaris - 为什么 java.lang.UNIXProcess.forkAndExec(Native Method) 挂起

java - Avro 架构和生成的文件中的十进制数据类型支持

java - 如何将多个列表中的值写入新的 csv 文件?