首页 > 解决方案 > Hibernate:来自非实体类的实体属性

问题描述

所以我有一个名为 Appointment 的休眠实体,在这个实体中我有一个 ApppointNumber 属性,它本身包含一个数字属性,它是一个字符串。当我坚持我的约会时,我需要 AppointmentNumber。前几天我让它与@Embedded 和@Embeddable 一起工作,但这会创建一个我无法拥有的连接表。我尝试了许多其他解决方案来尝试让它在没有连接表的情况下工作,但我无法弄清楚。(我得到很多 ava.lang.IllegalStateException) 有人可以帮忙吗?谢谢!

@Entity(name = "appointments")
public class Appointment {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "id")
    private int id;

    @OneToOne(mappedBy = "number")
    @Fetch(value = FetchMode.SELECT)
    private AppointmentNumber appointmentNumber;

预约实体

AppointmentNumber,在 Appointment 中使用但不应该是实体

public class AppointmentNumber {

    @OneToOne
    @JoinColumn(name = "appointmentNumber", unique = true, nullable = false)
    private String number;

标签: javahibernateh2

解决方案


你可以这样做:

@Entity(name = "appointments")
public class Appointment {

  ///....
  @Convert(converter = AppointmentNumberConverter.class)
  private AppointmentNumber appointmentNumber;
  ///....
}


@Converter
public class AppointmentNumberConverter implements 
AttributeConverter<PersonName, String> {

  @Override
  public String convertToDatabaseColumn(AppointmentNumber appointmentNumber) {
    if (appointmentNumber == null) {
        return null;
    }

    return appointmentNumber.getNumber();
  }

  @Override
  public AppointmentNumber convertToEntityAttribute(String appointmentNumber) {
    if (appointmentNumber == null) {
        return null;
    }
    AppointmentNumber result = new AppointmentNumber();
    result.setNumber(appointmentNumber);
    return result;
  }
}

查看 JPA 转换器文档。


推荐阅读