2013-03-14 14 views
7

Staram relacje pomiędzy WZP przy użyciu wbudowanego w adnotacji, ale nie jestem w stanie uruchomić go z powodzeniem,@ElementCollection @CollectionTable w jeden do wielu mapowanie

Oto moja baza danych SQL Script jest następująca,

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) 
) 

Oto kod poniżej 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 
} 

Oto odwzorowanie 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 
} 

Ale jeśli próbuję utrzymywać College z zestawem Kursy zbierania, daje mi wyjątek,

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 

.... 
.. 

Czy możesz mi powiedzieć, czy moje podejście jest błędne, Albo moje zrozumienie dla @CollectionTable jest nadal minimalne, Czy idę źle

Odpowiedz

5

Ponieważ obie tabele mają własne kolumny ID, stan hibernacji będzie wymagał obu typów: @Entity. @Embeddables nie mają własnego ID. Tak więc, pierwszym krokiem jest zmiana Course być @Entity, z odpowiednimi @TableName itp

Prowadzi to do drugiej kwestii, jaką jest gromadzenie Course obiektów nie powinny być @ElementCollection, powinien on być osobą @OneToMany kolekcja, z numerem @JoinColumn określającym, że będzie to klucz obcy z TBL_COURSE.

Wreszcie, poprzez zbiór Course w College, jak również College id w Course, jesteś sugerując, że chcesz bidirectional association. Wśród innych tego nie powinieneś mieć ID uczelni w Course. Powinieneś po prostu mieć odniesienie College. Jeśli nie potrzebujesz nawigować z poziomu Course ->College, możesz usunąć to na razie, dopóki nie uzyskasz lepszego zrozumienia mapowania obiektów Hibernate.

+0

Nie należy zdefiniować OneToMany adnotacji itp .. wystarczy wyjąć ID adnotacji z embedde d klasa. Oczywiście adnotacja GeneratedValue również powinna zostać usunięta. – asch

+0

@asch - To prawda, jeśli założysz, że OP nie chciał, aby Kursy były obiektami pierwszej klasy. Biorąc pod uwagę tabele, jak zdefiniowano, usunięcie adnotacji ID mogłoby spowodować problemy. – sharakan

+0

Kursy są już oznaczone jako Osadzane, więc i tak nie jest to Podmiot (domyślam się, że masz na myśli "obiekt pierwszej klasy"). – asch

0

trzeba zdefiniować dołączyć około dwóch Pojo

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

Choć moje podejście nie jest właściwe, ale nadal pracował z niewielkimi zmianami w kodzie,

przede wszystkim rzuciłem TBL_COURSE stołowego i stworzył nowy, jak następuje,

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

tutaj widzisz, że usunąłem klucz podstawowy, teraz jest tylko klucz i nazwa referencyjna,

Teraz w trakcie.Java, ja po,

@Embeddable 
public class Course { 

// constuctor 

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

przykładzie i usunięto @Id adnotacji i właściwości id, i nawet usunięte mapowanie College_Id,

i resztę kod jest taki sam jak ten obecny College.java ,

I to działało,

Czekam na opinie

+0

To dobrze, tak długo, jak chcesz, aby "Kurs" zawierał cykl życia zdefiniowany przez Kolegium i nie być samodzielnym bytem. Nie będzie również można podklasy "Course" itp. – sharakan

Powiązane problemy