2017-02-25 6 views
0

S'il vous plaît pouvez-vous m'aider? En JPA, j'essaie de créer une relation bidirectionnelle OneToMany, mais j'ai les erreurs suivantes: "[EclipseLink-63]: La méthode de création d'instance [entity.OrderLine.], Sans paramètre, n'existe pas ou n'est pas accessible [EclipseLink-28019]: Le déploiement de PersistenceUnit [simple-jpaPU] a échoué. Fermez toutes les usines pour cette unité PersistenceUnit. "JPA OneToMany relation bidirectionnelle [EclipseLink-63] erreur

Il y a mes entités: OneToMany Entité:

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 Entité:

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

Répondre

0

Il échoue parce que OrderLine n'a pas constructeur sans arg. Il est requis comme indiqué dans la spécification JPA 2.1 (Chapitre 2.1):

La classe d'entité doit avoir un constructeur sans-argument. La classe d'entité peut également avoir d'autres constructeurs. Le constructeur no-arg doit être public ou protégé.

Le constructeur par défaut n'est pas généré car un autre constructeur est fourni. Problème peut être résolu en ajoutant constructeur suivant:

public OrderLine() { 
} 
+0

Whan-je ajouter les constructeurs sans arg dans les deux entités que j'ai cette erreur: –

+0

Quand j'ajoute les non-arg constructeurs dans les deux entités j'ai cette erreur: "[EclipseLink-4002]: org.eclipse.persistence.exceptions.DatabaseException Exception interne: org.postgresql.util.PSQLException: ERREUR: erreur de syntaxe sur" ORDER "Position: 13 Code d'erreur: 0 Appel: INSERT INTODER (ID, CREATIONDATE) VALEURS (?,?) Bind => [2 paramètres liés] Requête: InsertObjectQuery (entity.Order [id = 151]) sur org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl. commit (EntityTransactionImpl.java:157) " –

+0

Votre deuxième problème n'a pas de chose à faire avec le constructeur sans-arg. Mon français est un peu rouillé, mais le problème est que ORDER est un mot réservé en SQL. Une façon de résoudre le problème est d'éviter le mot réservé comme nom de table. Si ce n'est pas possible, deux autres façons de résoudre un tel problème peuvent être trouvées ici: http://stackoverflow.com/questions/6791882/jpa-database-delimiters –