我在抽象类中遇到问题,我们实现了一个接口。 现在接口在我们的抽象类的实现中,而不是其他实现。 我会在这里给你看代码:
@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
答案 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实体中的一个选项。
那是因为你的实体类需要映射到具体的类和数据库表。