我正在寻找以下替代方案,因为不支持将@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
]
答案 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表中有Pickup
和Delivery
中的所有列。最大的缺点是,无法将Pickup
或Delivery
中的任何列定义为NotNull
,因为如果FulfillmentType不是该列,则该列将是null
您也可以使用Any
映射,但是据我从您的模型和描述可以看出,可嵌入对象似乎是最好的解决方案。