java:jpa的高级继承
我对我们实现接口的抽象类有一个问题。 现在,接口在我们的抽象类实现中,而不是在其他实现中。 我将在此处向您显示代码:java:jpa的高级继承,java,inheritance,jpa,interface,abstract-class,Java,Inheritance,Jpa,Interface,Abstract Class,我对我们实现接口的抽象类有一个问题。 现在,接口在我们的抽象类实现中,而不是在其他实现中。 我将在此处向您显示代码: @MappedSuperclass public abstract class AbstractOrder { @Id @GeneratedValue private Long idOrder; @Temporal(TemporalType.TIMESTAMP) @Column(name="datum") private Date
@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>();
...
}
@MappedSuperclass
公共抽象类AbstractOrder{
@身份证
@生成值
私人长订单;
@时态(TemporalType.TIMESTAMP)
@列(name=“datum”)
私有日期=新日期();
@OneToMany(targetEntity=IOrderLine.class)
private List orderLines=new ArrayList();
私有字符串重新排序;
...
}
@实体
@表(name=“supplyorders”)
公共类SupplyOrder扩展AbstractOrder实现可比较、可序列化{
@许多酮
私人供应商;
@枚举(EnumType.STRING)
私有SupplyOrderStatus状态=SupplyOrderStatus.TOBESUPPLIED;
@元素集合
私有集customerOrders=新HashSet();
...
}
@实体
@表(name=“customerorders”)
公共类CustomerOrder扩展了AbstractOrder实现了可解析、可序列化{
@许多酮
私人客户;
@许多酮
私人场所;
@许多酮
私人用户供应商;
私人双重存款;
@枚举(EnumType.STRING)
private OrderStatus status=OrderStatus.CREATED;
}
@映射超类
公共接口线{
double getSubTotal();
int getQuantity();
家具(家具);
}
@实体
@表(name=“supplyorderlines”)
公共类SupplyOrderLine实现IOrderLine,可序列化{
@身份证
@生成值
私人长id;
@独身癖
私有列表customerOrderLines=新的ArrayList();
...
}
当然还有一个实现IOrderLine的类customerRorderline
现在,对于supplyOrder,其中包含supplyOrderLines,customerOrder中包含CustomerOrderLines
我们遇到的错误是抽象类不知道对接口IOrderLine采取什么实现
如何在实现类中重写抽象类中的orderline字段,并用注释指向IOrderLine的实现
Thx提前
Chillworld在Java中,不能实例化接口 您只能实例化实现接口的实际类 实际上没有像IOrderLine.class这样的东西 您可能希望在子类中声明
订单行
字段
在子类中,您可以使用具体的类(将映射到真实的数据库表)声明字段
如果您需要/想要使用抽象类来泛指行项目(这似乎是一个非常好的想法),您可以使用一个返回接口的抽象方法
下面是一个例子:
@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();
}
@MappedSuperclass
公共抽象类AbstractOrder{
@身份证
@生成值
私人长订单;
@时态(TemporalType.TIMESTAMP)
@列(name=“datum”)
私有日期=新日期();
//这个抽象方法将由子类实现
公共摘要列表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;
}
}
@实体
@表(name=“supplyorderlines”)
公共类SupplyOrderLine实现IOrderLine,可序列化{
@身份证
@生成值
私人长id;
@OneToMany(targetEntity=SupplyOrderLine.class)
私有列表客户订单行;
@凌驾
公共列表getOrderLines(){
返回客户订单行;
}
}
如果这不是关于JPA实体,您也可以这样做:
public abstract class PojoClass {
private Long idOrder;
private Date date = new Date();
private List<? extends IOrderLine> orderLines = new ArrayList<? extends IOrderLine>();
}
公共抽象类PojoClass{
私人长订单;
私有日期=新日期();
私有列表在Java中,不能实例化接口
您只能实例化实现接口的实际类
实际上没有像IOrderLine.class这样的东西
您可能希望在子类中声明订单行
字段
在子类中,您可以使用具体的类(将映射到真实的数据库表)声明字段
如果您需要/想要使用抽象类来泛指行项目(这似乎是一个非常好的想法),您可以使用一个返回接口的抽象方法
下面是一个例子:
@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();
}
@MappedSuperclass
公共抽象类AbstractOrder{
@身份证
@生成值
私人长订单;
@时态(TemporalType.TIMESTAMP)
@列(name=“datum”)
私有日期=新日期();
//这个抽象方法将由子类实现
公共摘要列表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;
}
}
@实体
@表(name=“supplyorderlines”)
公共类SupplyOrderLine实现IOrderLine,可序列化{
@身份证
@生成值
私人长id;
@OneToMany(targetEntity=SupplyOrderLine.class)
私有列表客户订单行;
@凌驾
公共列表getOrderLines(){
返回客户订单行;
}
}
如果这不是关于JPA实体,您也可以这样做:
public abstract class PojoClass {
private Long idOrder;
private Date date = new Date();
private List<? extends IOrderLine> orderLines = new ArrayList<? extends IOrderLine>();
}
公共抽象类PojoClass{
私人长订单;
私有日期=新日期();
private list当你说“抽象类不知道接口IOrderLine的实现是什么…”这对我来说没有任何意义。抽象类是如何“接受”的一个接口?一个抽象类应该对它的子类一无所知。它的JPA给出了错误原因,JPA不知道他必须为IORDLines读什么表,supplyOrder和customerOrder对接口IORDLine和thx进行了不同的实现,以格式化代码。好的……我明白了。答案来了