Ошибка двунаправленного отношения JPA OneToMany [EclipseLink-63]

Не могли бы вы мне помочь пожалуйста? В JPA я пытаюсь создать двунаправленное отношение OneToMany, но у меня возникают следующие ошибки: «[EclipseLink-63]: метод создания экземпляра [entity.OrderLine.] без параметров не существует или недоступен. [EclipseLink-28019]: Не удалось развернуть PersistenceUnit [simple-jpaPU]. Закройте все фабрики для этого PersistenceUnit».

Есть мои сущности: OneToMany Entity:

package entity;
import java.util.*;
import java.io.Serializable;
import javax.persistence.*;
import org.eclipse.persistence.annotations.TimeOfDay;

@Entity
public class Order implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @Temporal(TemporalType.TIMESTAMP)
    private Date creationDate;    
    @OneToMany(mappedBy = "o")
    private   List<OrderLine>  orderLines; 

    public Date getCreationDate() {
        return creationDate;
    }

    public void setCreationDate(Date creationDate) {
        this.creationDate = creationDate;
    }

    public List<OrderLine> getOrderLines() {
        return orderLines;
    }

    public void setOrderLines(ArrayList<OrderLine> orderLines) {
        this.orderLines = orderLines;
    }

    public Order(Date creationDate) {
        this.creationDate = creationDate;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public String toString() {
    return "entity.Order[ id=" + id + " ]";
    }
}

Сущность ManyToOne:

package entity;

import java.io.Serializable;
import javax.persistence.*;

@Entity
@Table(name="orderline_table")
public class OrderLine implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String item; 
    private  Double unitPrice;   
    private Integer quantity;
    @ManyToOne
    Order o; 

    public String getItem() {
        return item;
    }

    public void setItem(String item) {
        this.item = item;
    }

    public Double getUnitPrice() {
        return unitPrice;
    }

    public void setUnitPrice(Double unitPrice) {
        this.unitPrice = unitPrice;
    }

    public Integer getQuantity() {
        return quantity;
    }

    public void setQuantity(Integer quantity) {
        this.quantity = quantity;
    }

    public OrderLine(String item, Double unitPrice, Integer quantity) {
        this.item = item;
        this.unitPrice = unitPrice;
        this.quantity = quantity;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }


    @Override
    public String toString() {
        return "entity.OrderLine[ id=" + id + " ]";
    }    
}

person Malik Berrada    schedule 25.02.2017    source источник


Ответы (1)


Это не удается, потому что OrderLine не имеет конструктора без аргументов. Это требуется, как указано в спецификации JPA 2.1 (глава 2.1):

Класс сущности должен иметь конструктор без аргументов. Класс сущности может иметь и другие конструкторы. Конструктор без аргументов должен быть общедоступным или защищенным.

Конструктор по умолчанию не создается, поскольку задан другой конструктор. Проблема может быть решена путем добавления следующего конструктора:

public OrderLine() {
}
person Mikko Maunu    schedule 27.02.2017
comment
Когда я добавляю конструкторы без аргументов в два объекта, у меня возникают следующие ошибки: - person Malik Berrada; 05.03.2017
comment
Когда я добавляю конструкторы без аргументов в два объекта, у меня появляется эта ошибка: [EclipseLink-4002]: org.eclipse.persistence.exceptions.DatabaseException Внутреннее исключение: org.postgresql.util.PSQLException: ERREUR: erreur de syntactice sur ou до «ЗАКАЗА» Позиция: 13 Код ошибки: 0 Вызов: ВСТАВИТЬ В ЗАКАЗ (ИДЕНТИФИКАТОР, ДАТА СОЗДАНИЯ) ЗНАЧЕНИЯ (?,?) bind => [2 параметра связаны] Запрос: InsertObjectQuery (entity.Order [id = 151]) в org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:157) - person Malik Berrada; 05.03.2017
comment
Ваша вторая проблема не имеет ничего общего с конструктором без аргументов. Мой французский немного заржавел, но проблема в том, что ORDER является зарезервированным словом в SQL. Один из способов решения проблемы — избегать использования зарезервированного слова в качестве имени таблицы. Если это невозможно, здесь можно найти два других способа решения такой проблемы: stackoverflow.com/questions/6791882/jpa-database-delimiters - person Mikko Maunu; 05.03.2017
comment
Большое спасибо, я только что изменил имя объекта Order на Commande, и это сработало. - person Malik Berrada; 05.03.2017