2013-07-16 4 views
1

У меня проблема с абстрактным классом, где мы реализуем интерфейс. Теперь интерфейс находится в нашей реализации абстрактного класса, отличного от другой реализации. я покажу вам код здесь:java: расширенное наследование для jpa

@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>(); 
    ... 
} 

и конечно класс CustormerOrderLine, который реализует IOrderLine.

Теперь у поставщиков поставки есть запасные листы в них, а у customerOrder есть CustomerOrderLine.

Ошибка, которую мы получаем, заключается в том, что абстрактный класс не знает, какую реализацию следует использовать для интерфейса IOrderLine.

Как я могу переопределить поле orderLines из абстрактного класса класса реализации и указать на реализацию IOrderLine с аннотациями?

Thx заранее.

Chillworld

+0

Что вы имеете в виду, когда говорите: «абстрактный класс не знает, какую реализацию следует использовать для интерфейса IOrderLine ...». Это не имеет для меня никакого смысла. Как абстрактный класс «_take_» является интерфейсом? Абсолютный класс должен знать ** ничего ** о своих подклассах. – jahroy

+0

Его JPA, которая дает ошибку, приводит к тому, что JPA не знает, какую таблицу он должен читать для IorderLines, supplyOrder и customerOrder использует различную реализацию интерфейса IOrderLine и thx для форматирования кода. – chillworld

+0

Хорошо ... Я понял. Отвечаю. – jahroy

ответ

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.

Это потому, что ваш класс сущности должен сопоставлять конкретный класс и таблицу базы данных.

+0

Oke, я опускаю поле в реализацию, поэтому я могу реализовать нужный класс, который им нужен. Теперь это также немного более безопасно, если они вводят неправильный порядок. Thx для вас ответ. – chillworld

+0

Хорошо ... Не отказывайтесь от идеи иметь метод в своем абстрактном классе, который позволяет вам иметь дело со всеми подклассами в целом. Это была хорошая идея с вашей стороны, которую вы все еще можете использовать. – jahroy

+0

Да, я думаю, я знаю и способ его реализации. Я мог бы использовать аннотации на геттерах impl абстрактного класса и поставить там @ElementCollection (tagretClass = SuppyOrderLine.class) для supplyOrder и для CustomerOrder для другой реализации. (Но вам просто нужно переопределить геттер абстрактного класса) Greetz chill. – chillworld

Смежные вопросы