2017-02-25 152 views
0

请你能帮助我吗?在JPA中,我尝试创建一个OneToMany双向关系,但我遇到以下错误: “[EclipseLink-63]:实例创建方法[entity.OrderLine。],没有参数,不存在或不可访问。 [EclipseLink-28019]:部署PersistenceUnit [simple-jpaPU]失败。关闭此PersistenceUnit的所有工厂。“JPA OneToMany双向关系[EclipseLink-63]错误

有我的实体: 一对多实体:

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 + " ]"; 
    } 
} 

多对一实体:

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 + " ]"; 
    }  
} 

回答

0

因为OrderLine没有无参数的构造函数它失败。按照JPA 2.1规范(2.1章)的规定,这是必需的:

实体类必须有一个无参数构造函数。实体类也可以具有其他构造函数。无参数构造函数必须是公共的或受保护的。

由于给出了其他构造函数,因此不会生成默认构造函数。问题可以通过添加下面的构造是固定的:

public OrderLine() { 
} 
+0

焕我添加了无参构造函数的两个实体我有这样的错误: –

+0

当我在两个实体添加无参数的构造函数我有这样的错误: “[EclipseLink-4002]:org.eclipse.persistence.exceptions.DatabaseException内部异常:org.postgresql.util.PSQLException:ERREUR:erreur de syntaxe sur ouprèsde«ORDER»位置:13错误代码:0调用:在org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl处插入ORDER(ID,CREATIONDATE)VALUES(?,?)bind => [2参数绑定] Query:InsertObjectQuery(entity.Order [id = 151])。提交(EntityTransactionImpl.java:157)“ –

+0

你的第二个问题没有与无参数构造函数有关的事情。我的法语有点生疏,但问题在于ORDER是SQL中的保留字。解决问题的一种方法是避免保留字作为表名。如果这是不可能的,可以从这里找到解决这个问题的其他两种方法:http://stackoverflow.com/questions/6791882/jpa-database-delimiters –