Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java:jpa的高级继承_Java_Inheritance_Jpa_Interface_Abstract Class - Fatal编程技术网

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进行了不同的实现,以格式化代码。好的……我明白了。答案来了