寻找@Embeddable @MappedSuperClass的休眠替代方案

时间:2019-08-27 20:37:38

标签: hibernate

我正在寻找以下替代方案,因为不支持将@Embeddable和@MappedSuperClass组合使用。

我有一个Order实体,其中包含一个实现对象。我想要数据库中“订单”表上的大多数履行字段。这应该是使用@Embedded和@Embeddable的经典案例,但是在某些情况下,我需要从另一个表(车辆)获得更多信息,并且仅在实现类型为Pickup的情况下才想获取额外的数据。

Fulfillment对象是一个抽象类,其中具体类基于Fulfillment类型(Pickup,Delivery等)

@Entity
@Table(name="order")
public class Order {
  @Id
  @Column(name="order_id")
  private String id;

  @Embedded
  private Fulfillment fulfillment;
}

@Embeddable
@MappedSuperClass
public abstract class Fulfillment {

  @Column(name="fulfillment_type")
  private FulfillmentType type;
}

public class Pickup extends Fulfillment {
  private Vehicle vehicle;
}

public class Delivery extends Fulfillment {

}

@Entity
@Table(name="vehicle")
public class Vehicle {
  @Column(name="vehicle_id")
  private String id;

  @Column(name="make") 
  private String make;

  @Column(name="color")
  private String color;
}

我希望2张桌子是:

   order
   [
      order_id varchar,
      fulfillment_type varchar,
    ] 

    vehicle [
      vehicle_id varchar,
      make varchar,
      color varchar
    ]

1 个答案:

答案 0 :(得分:0)

我会在您的容器类中添加所有个可能的可嵌入对象:

@Entity
public class Order {
  @Id
  private String id;

  private FulfillmentType type;

  @Embedded
  private Pickup pickup;

  @Embedded
  private Delivery delivery;

  public Fulfillment getFulfillment() {
    switch (type) {
      case PICKUP: return pickup;
      case DELIVERY: return delivery;
    }
  }
}

public abstract class Fulfillment {

}

@Embeddable
public class Pickup extends Fulfillment {
  @ManyToOne
  private Vehicle vehicle;
}

@Embeddable
public class Delivery extends Fulfillment {
  // ... attributes
}

数据库布局看起来像预期的那样,在Order表中有PickupDelivery中的所有列。最大的缺点是,无法将PickupDelivery中的任何列定义为NotNull,因为如果FulfillmentType不是该列,则该列将是null

您也可以使用Any映射,但是据我从您的模型和描述可以看出,可嵌入对象似乎是最好的解决方案。