1

我对实现接口的抽象类有疑问。现在接口在我们的抽象类的实现中,而不是在其他实现中。我将在这里向您展示代码:

@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 的实现?

提前谢谢。

寒冷世界

4

1 回答 1

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 实体中的一个选项。

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

于 2013-07-16T07:16:00.080 回答