2013-03-14 12 views
7

sto provando in relazione tra APP utilizzando annotazioni embedded, ma io non sono in grado di eseguire con successo,@ElementCollection @CollectionTable in Uno a Molti mappatura

Qui il mio script SQL database è il seguente,

create table TBL_COLLEGE(
    id integer primary key generated always as identity (start with 1000, increment by 5), 
    name varchar(50) 
) 

create table TBL_COURSE(
    Id integer primary key generated always as identity (start with 10, increment by 1), 
    college_Id integer references TBL_COLLEGE, 
    name varchar(50) 
) 

Ecco il codice qui sotto per JPA,

@Embeddable 
public class Course { 
... 
... 
.. 
@Id 
@GeneratedValue(strategy= GenerationType.IDENTITY) 
@Column(name="ID") 
private Integer courseId; 

@Column(name="NAME") 
private String courseName; 

@Column(name="COLLEGE_ID") 
private Integer collegeId; 
.... 
// getter and setter 
} 

Ecco la mappatura college,

@Entity 
@Table(name="TBL_COLLEGE") 
public class College implements Serializable{ 
    @Id 
    @GeneratedValue(strategy= GenerationType.IDENTITY) 
    @Column(name="ID") 
    private Integer collegeId; 

    ... 
    .. 
    @ElementCollection(targetClass=Course.class,fetch= FetchType.LAZY) 
    @CollectionTable(name="TBL_COURSE",[email protected](name="COLLEGE_ID")) 
    private Set<Course> course; 
    .. 
    // getter and setter 
} 

Ma se provo a persistere college con set Corsi di raccolta, mi dà un'eccezione,

ERROR: HCANN000002: An assertion failure occurred (this may indicate a bug in Hibernate) 
org.hibernate.annotations.common.AssertionFailure: Declaring class is not found in the inheritance state hierarchy: com.entities.Course 

.... 
.. 

Può cortesemente dirmi se il mio approccio è sbagliato, O la mia comprensione per @CollectionTable è ancora minima, Erano sto andando male

risposta

5

Poiché entrambe le tabelle hanno le proprie colonne ID, Hibernate vorrà che siano entrambi tipi @Entity. @Embeddables non hanno il proprio ID. Quindi, primo passo è quello di cambiare Course essere @Entity, con corrispondenti @TableName, ecc

Ciò porta al secondo problema, che è che la raccolta di oggetti Course non dovrebbe essere un @ElementCollection, dovrebbe essere un'entità @OneToMany raccolta, con un @JoinColumn che specifica che COLLEGE_ID sarà la chiave esterna da TBL_COURSE.

Infine, per avere una collezione di Course in College, così come un College id in Course, si sta insinuando che si desidera un bidirectional association. Tra gli altri impatti, non dovresti avere il ID del college in Course. Dovresti semplicemente avere il riferimento College. Se non è necessario spostarsi da Course ->College, è possibile rimuoverlo per ora, fino a quando non si sarà migliorata la comprensione della mappatura degli oggetti di Hibernate.

+0

Non è necessario definire l'annotazione OneToMany ecc .. E 'sufficiente rimuovere ID annotazioni dal embedde classe Ovviamente anche l'annotazione GeneratedValue dovrebbe essere rimossa. – asch

+0

@asch: è vero, se si presuppone che l'OP non desideri che i corsi siano oggetti di prima classe. Date le tabelle come definite, rimuovere l'annotazione dell'ID causerebbe problemi. – sharakan

+0

I corsi sono già annotati come Embeddable, quindi non è comunque l'Entità (suppongo si intenda ciò con "l'oggetto di prima classe") – asch

0

È necessario definire il join circa due POJO

@OneToMany 
@JoinColumn(name=course table column id) 
private Set<Course> course; 
0

Anche se il mio approccio non è corretta, ma ancora ha funzionato con alcune piccole modifiche nel codice,

prima di tutto ho lasciato cadere la TBL_COURSE tavolo e ha creato uno nuovo, come segue,

create table TBL_COURSE( 
    college_Id integer references TBL_COLLEGE, 
    name varchar(50) 
) 

qui puoi vedere che ho rimosso la chiave primaria, ora c'è solo la chiave e il nome di riferimento,

Ora in corso.java, ho fatto seguente,

@Embeddable 
public class Course { 

// constuctor 

@Column(name="NAME") 
private String courseName; 
.. 
// setter getter 
} 

Here i rimosso annotazione @Id e proprietà id, ho anche rimosso la mappatura College_Id,

e il resto del codice è lo stesso come presente in College.java ,

E ha funzionato,

Aspettando le opinioni

+0

Va bene, finché si desidera che "Corso" abbia il ciclo di vita definito da "College". e non essere un'entità indipendente. Inoltre, non potrai sottoclasse di 'Course', ecc. – sharakan

Problemi correlati