2010-08-11 9 views
0

J'utilise: NetBeans IDE 6.7.1, GlassFish v2.1, Oracle 10g XE, JAVA 6 SE, JAVA 5 EE.Le @JoinColumns sur l'élément annoté [...] de la classe d'entité [...] est incomplet

J'ai un problème avec une annotation @ManyToMany:

@ManyToMany(fetch=FetchType.EAGER) 
@JoinTable(name="CUST_RENT_MOVIE", joinColumns={@JoinColumn(name="CUST_ID")}, inverseJoinColumns={@JoinColumn(name="TITLE")}) 
private Collection<CustRentMovie> rents = new ArrayList<CustRentMovie>(); 

partie de la sortie du GlassFish v2.1.1

Exception Description: The @JoinColumns on the annotated element [private java.util.Collection vc.domain.Customer.rents] from the entity class [class vc.domain.Customer] is incomplete. When the source entity class uses a composite primary key, a @JoinColumn must be specified for each join column using the @JoinColumns. Both the name and the referenceColumnName elements must be specified in each such @JoinColumn. 
javax.persistence.PersistenceException: Exception [TOPLINK-28018] (Oracle TopLink Essentials - 2.1 (Build b31g-fcs (10/19/2009))): oracle.toplink.essentials.exceptions.EntityManagerSetupException 
Exception Description: predeploy for PersistenceUnit [vc_pu] failed. 

partie du script qui crée la base de données:

CREATE table customer 
(
cust_id NUMBER(5),  
CONSTRAINT cust_pk PRIMARY KEY (cust_id), 
... 
) 

CREATE TABLE movie 
(
title VARCHAR2(50) PRIMARY KEY, 
... 
) 

CREATE TABLE cust_rent_movie 
(
title VARCHAR2(50), 
cust_id NUMBER(5), 
rent_date DATE DEFAULT current_date NOT NULL, 
return_date DATE, 
CONSTRAINT cust_rent_movie_pk PRIMARY KEY (title, cust_id, rent_date), 
CONSTRAINT CustRentMovie_movie_fk FOREIGN KEY (title) REFERENCES movie ON DELETE CASCADE, 
CONSTRAINT CustRentMovie_cust_fk FOREIGN KEY (cust_id) REFERENCES customer ON DELETE CASCADE 
) 

le code de la classe de client

@Entity 
@Table(name = "customer") 
@SequenceGenerator(name="seq", sequenceName="cust_id_seq", allocationSize=1) 
public class Customer implements Serializable 
{ 

    @Id 
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq") 
    @Column(name="CUST_ID") 
    private int id; 


    @ManyToMany(fetch=FetchType.EAGER) 
    @JoinTable(name="CUST_RENT_MOVIE", joinColumns={@JoinColumn(name="CUST_ID")}, inverseJoinColumns={@JoinColumn(name="TITLE")}) 
    private Collection<CustRentMovie> rents = new ArrayList<CustRentMovie>(); 


    public Collection<CustRentMovie> getRents() 
    { 
     return rents; 
    } 

    public void setRents(Collection<CustRentMovie> rents) 
    { 
     this.rents = rents; 
    } 
... 
} 

par erreur que je mets le type dans la collection de la CustRentMovie de classe au lieu de film donc j'ai changé le

private Collection<CustRentMovie> rents = new ArrayList<CustRentMovie>(); 

à

private Collection<Movie> movies = new ArrayList<Movie>(); 
+0

Juste pour être sûr, voulez-vous vraiment mapper un grand nombre l'association entre 'Customer' et' CustRentMovie' (ou un nombre de many-to-many entre 'Customer' et' Movie')? –

+0

Je souhaite mapper une association plusieurs-à-plusieurs entre client et film. CustRentMovie est la table de jointure. L'association a comme propriétés le jour du rouge et le jour du retour. Parce qu'un client peut louer le même film plus d'un j'ai ajouté le red_date à la clé primaire. – IVANNHS

+0

C'est ce que je pensais. –

Répondre

1

PK de CustomerRentMovie est composé de trois colonnes (titre, cust_id, rent_date). Le lien supérieur indique que vous devez spécifier les trois colonnes de jointure dans votre annotation @JoinColumn (vous n'avez actuellement spécifié que cust_id). Changer l'annotation à quelque chose comme ceci devrait vous aider à dépasser cette erreur.

@JoinTable(name = "CUST_RENT_MOVIE", joinColumns = { 
    @JoinColumn(name = "CUST_ID"), 
    @JoinColumn(name = "TITLE"), 
    @JoinColumn(name = "RENT_DATE") }, inverseJoinColumns = { @JoinColumn(name = "TITLE") }) 
private Collection<CustRentMovie> rents = new ArrayList<CustRentMovie>(); 

Cela dit, la question de Pascal est valide - il semble que vous l'intention d'avoir une relation de client à film, et non client à CUST_RENT_MOVIE.

0

par erreur que je mets le type dans la collection de la CustRentMovie de classe au lieu de film donc j'ai changé le

private Collection<CustRentMovie> rents = new ArrayList<CustRentMovie>(); 

à

private Collection<Movie> movies = new ArrayList<Movie>(); 
+0

Veuillez mettre à jour votre question pour refléter cela. TIA. –

+0

Voulez-vous définir cette réponse comme ma réponse acceptée? ou je dois faire autre chose. – IVANNHS

+0

Non, ce n'est pas ce que je veux dire - je pense que la réponse de Mike est un meilleur candidat :) Ce que je veux dire est d'utiliser le lien [edit] 'en bas de votre question initiale pour éditer son contenu [edit] 'lien?). –