2017-02-25 136 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 –