@Convert @Id字段

时间:2017-05-19 11:50:12

标签: hibernate jpa spring-data-jpa converter

我试图

sudo pip install --upgrade oauth2client

IdConverter是:

@Id
@Column(name = "MY_ID_FIELD")
@Convert(converter = IdConverter.class)
private Long id;

转换器将映射BigDecimal,属性字段类型Hibernate期望在sql server数据库中id列类型为数字,为Long。

我正在使用Spring Data Jpa,而我的存储库正在使用Long,正如我所希望的那样

@Converter
public class IdConverter implements AttributeConverter<Long, BigDecimal> {

    @Override
    public BigDecimal convertToDatabaseColumn(Long attribute) {
        return BigDecimal.valueOf(attribute);
    }

    @Override
    public Long convertToEntityAttribute(BigDecimal dbData) {
        return dbData.longValue();
    }
}

你知道它为什么不起作用吗?

3 个答案:

答案 0 :(得分:5)

@Id@Convert无法一起使用。使用@IdClass可以解决此问题。您只需将@Convert移至@IdClass

@Entity
@IdClass(PK.class)
public class YourClass {
  @Id
  private Long id;
  ...
}


public class PK implements Serializable {
  @Column(name = "MY_ID_FIELD")
  @Convert(converter = IdConverter.class)
  private Long id;
}

答案 1 :(得分:3)

万一其他人遇到了我遇到的相同问题,您除了在@Column上还必须在@IdClass上加上@Converter注释工作(而不是依靠命名策略)。

// doesn't work
public class PK implements Serializable {
  @Convert(converter = IdConverter.class)
  private Long id;
}
// works
public class PK implements Serializable {
  @Column(name = "ID")
  @Convert(converter = IdConverter.class)
  private Long id;
}

答案 2 :(得分:0)

使用 EclipseLink 2.7.6 我遇到了同样的问题。
我的解决方案是:

实体类:


    @Entity(name = "xxx")
    public class xxx implements Serializable {
      @EmbeddedId
      private XxxPk pk;
      ...
    }

ID 类:


    @Embeddable
    public class XxxPk implements Serializable {
      @Column(name = "A_TYPE")
      @Convert(converter = ATypeAttributeConverter.class)
      private AType aTypeAttribute;
      ...
    }

转换器:


    import javax.persistence.AttributeConverter;
    import javax.persistence.Converter;
        
    @Converter
    public class ATypeAttributeConverter implements AttributeConverter<AType , String> {
        
      @Override
      public String convertToDatabaseColumn(AType agrType) { ... }
        
      @Override
      public AType convertToEntityAttribute(String code) { ... }
    }

枚举:


    public enum AType {
      E1, E2, ...;
      ...
    }

我也用 EclipseLink-Converter (org.eclipse.persistence.annotations.Converter) 检查过,但没有成功。