如何在休眠中保留 AtomicInteger 而不是 Integer?

Mar*_*tin 0 java multithreading hibernate jpa atomicinteger

我尝试 使用hibernate java 框架持久保存一个具有AtomicInteger变量而不是Integer 的对象(保存后我需要在线程安全场景中使用该对象),但是当我尝试保存我的对象时,java 抛出:

java.lang.ClassCastException: java.util.concurrent.atomic.AtomicInteger cannot be cast to java.lang.Integer
Run Code Online (Sandbox Code Playgroud)

有什么方法可以将 AtomicInteger 映射到整数吗?有一个对象的例子:

public class Statistics implements java.io.Serializable {
  private AtomicInteger id;
  private AtomicInteger totalErrors;

  public Statistics() {
  }


  public AtomicInteger getTotalErrors() {
    return this.totalErrors;
  }

  public void seTotalErrors(AtomicInteger totalErrors) {
    this.totalErrors= totalErrors;
  }
}
Run Code Online (Sandbox Code Playgroud)

以及相应的 POJO xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
   <class name="Statistics" table="statistics" catalog="example" optimistic-lock="version">
      <id name="id" type="java.lang.Integer">
         <column name="id" />
         <generator class="identity" />
      </id>
      <property name="totalErrors" type="java.lang.Integer">
         <column name="total_errors" />
      </property>
   </class>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)

还有休眠版本:

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.2.10.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-hikaricp</artifactId>
        <version>5.2.10.Final</version>
    </dependency>
Run Code Online (Sandbox Code Playgroud)

Nic*_*lle 5

一种方法是编写一个 JPA 2.1 AttributeConverter,将 Integer 转换为 AtomicInteger,如下所示

@Converter
public class AtomicIntConverter implements AttributeConverter<AtomicInteger, Integer> {


 @Override
 public Integer convertToDatabaseColumn(AtomicInteger attribute) {
  return attribute.get();
 }

 @Override
 public AtomicInteger convertToEntityAttribute(Integer dbData) {
  return new AtomicInteger(dbData);
 }

}
Run Code Online (Sandbox Code Playgroud)

@Convert通常,您可以在类字段上使用 JPA注释@Entity,如下所示:

@Convert(converter = AtomicIntConverter.class)
private AtomicInteger totalErrors;
Run Code Online (Sandbox Code Playgroud)

您可以在此处的 Hibernate 5.2 文档中阅读有关它的更多信息

但当您使用 hibernate 映射文件时,请确保将 Converter 类的 FQN 设置为字段的类型,而不是使用注释@Converter

<property name="totalErrors" type="fully.qualified.name.of.AtomicIntConverter">
     <column name="total_errors" />
 </property>
Run Code Online (Sandbox Code Playgroud)