【问题标题】:java : advanced inheritance to jpajava : 对 jpa 的高级继承
【发布时间】:2013-07-16 06:40:21
【问题描述】:

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

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

提前致谢。

寒冷的世界

【问题讨论】:

  • 当你说“抽象类不知道接口 IOrderLine 采用什么实现...”时你是什么意思?我。抽象类如何“采用”接口?抽象类应该对它的子类一无所知
  • 它的 JPA 给出了错误原因 JPA 不知道他必须为 IorderLines 读取哪个表,supplyOrder 和 customerOrder 采用 IOrderLine 接口的不同实现和 thx 来格式化代码。
  • 好的...我明白了。答案来了。
  • 谢谢 jahroy,感谢您的帮助。

标签: java inheritance jpa interface abstract-class


【解决方案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 实体中的一个选项。

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

【讨论】:

  • 好吧,我已经将领域降级到实现,所以我可以实现他们需要的正确类。现在,如果他们输入了错误的 orderLine,它也会更加安全。谢谢你的回答。
  • 好吧...不要放弃在抽象类中拥有一个允许您通用处理所有子类的方法的想法。这是您的一个好主意,您仍然可以使用。
  • 是的,我想我也知道实现它的方法。我可以在抽象类的 impl 的 getter 上使用注释,并将 @ElementCollection(tagretClass=SuppyOrderLine.class) 放在 supplyOrder 和 CustomerOrder 的其他实现中。 (但你只需要重写抽象类的getter)Greetz chill。
  • @chillworld - 酷。我相信我建议的抽象方法可以解决问题。
猜你喜欢
  • 2012-08-02
  • 1970-01-01
  • 2019-03-10
  • 2011-08-20
  • 1970-01-01
  • 1970-01-01
  • 2011-09-04
  • 2014-10-30
  • 1970-01-01
相关资源
最近更新 更多