java:高级继承到jpa

时间:2013-07-16 06:40:21

标签: java inheritance jpa interface abstract-class

我在抽象类中遇到问题,我们实现了一个接口。 现在接口在我们的抽象类的实现中,而不是其他实现。 我会在这里给你看代码:

@MappedSuperclass
public abstract class AbstractOrder {
    @Id
    @GeneratedValue
    private Long idOrder;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="datum")
    private Date date = new Date();

    @OneToMany(targetEntity=IOrderLine.class)
    private List<IOrderLine> orderLines = new ArrayList<IOrderLine>();

    private String refOrder;
    ...
}

@Entity
@Table(name="supplyorders")
public class SupplyOrder extends AbstractOrder implements Comparable<SupplyOrder>, Serializable {

    @ManyToOne
    private Supplier supplier;

    @Enumerated(EnumType.STRING)
    private SupplyOrderStatus status = SupplyOrderStatus.TOBESUPPLIED;

    @ElementCollection
    private Set<CustomerOrder> customerOrders = new HashSet<CustomerOrder>();
    ...
}

@Entity
@Table(name="customerorders")
public class CustomerOrder extends AbstractOrder implements commparable<CustomerOrder>,Serializable {

    @ManyToOne
    private Customer customer;

    @ManyToOne
    private Place place;

    @ManyToOne
    private User vendor;

    private double deposit;

    @Enumerated(EnumType.STRING)
    private OrderStatus status = OrderStatus.CREATED;
}




@MappedSuperclass
public interface IOrderLine {
    double getSubTotal();
    int getQuantity();
    Furniture getFurniture();
}

@Entity
@Table(name="supplyorderlines")
public class SupplyOrderLine implements IOrderLine, Serializable {

    @Id
    @GeneratedValue
    private Long id;

    @OneToMany
    private List<CustomerOrderLine> customerOrderLines = new ArrayList<CustomerOrderLine>();
    ...
}

当然是实现IOrderLine的类CustormerOrderLine。

现在对于supplyOrder,他们在其中有supplyOrderLines,而customerOrder中包含了CustomerOrderLine。

我们得到的错误是抽象类不知道接口IOrderLine要采取什么实现。

如何从实现类中的抽象类覆盖orderLines的字段,并指向带注释的IOrderLine的实现?

提前谢谢。

Chillworld

1 个答案:

答案 0 :(得分:1)

在Java中,您无法实例化接口。

您只能实例化实现接口的实际类。

实际上没有IOrderLine.class这样的东西。

您可能希望在子类中声明orderLines字段。

在子类中,您可以使用具体类(将映射到真实数据库表)声明该字段。

如果您需要/想要使用抽象类来统一引用您的订单项(这似乎是一个非常良好的想法),您可以使用返回接口的抽象方法。

以下是一个例子:

@MappedSuperclass
public abstract class AbstractOrder {
    @Id
    @GeneratedValue
    private Long idOrder;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="datum")
    private Date date = new Date();

    // This abstract method will be implemented by sub-classes
    public abstract List<IOrderLine> getOrderLines();
}

然后,您可以在子类中添加字段并实现返回它们的抽象方法:

@Entity
@Table(name = "supplyorderlines")
public class SupplyOrderLine implements IOrderLine, Serializable {

    @Id
    @GeneratedValue
    private Long id;

    @OneToMany(targetEntity = SupplyOrderLine.class)
    private List<SupplyOrderLine> customerOrderLines;

    @Override
    public List<IOrderLine> getOrderLines() {
        return customerOrderLines;
    }
}

如果这不是关于JPA实体,你也可以这样做:

public abstract class PojoClass {

    private Long idOrder;
    private Date date = new Date();
    private List<? extends IOrderLine> orderLines = new ArrayList<? extends IOrderLine>();
}

但是,我不认为这是JPA实体中的一个选项。

那是因为你的实体类需要映射到具体的类和数据库表。