2013-03-14 2 views
7

Я пытаюсь отношение между в JPA с помощью встроенной аннотации, но я не смог запустить его успешно,@ElementCollection @CollectionTable в один ко многим картографирование

Вот моя база данных SQL скрипт выглядит следующим образом,

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

здесь ниже код 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 
} 

Вот отображение колледжа,

@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 
} 

Но если я пытаюсь упорствовать колледж с коллекции Курсы набора, это дает мне исключение,

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 

.... 
.. 

Можете ли вы сказать мне ли мой подход неправилен, Или мое понимание для @CollectionTable является еще минимален, Были я неправильно

ответ

5

Поскольку обе ваши таблицы имеют свои собственные столбцы ID, Hibernate захочет, чтобы оба они были @Entity. @Embeddables не имеют собственных ID. Таким образом, первый шаг заключается в изменении Course быть @Entity, с соответствующими @TableName и т.д.

Это приводит ко второму вопросу, который является то, что сбор Course объектов не должен быть @ElementCollection, оно должно быть @OneToMany лица коллекции, с @JoinColumn, указав, что COLLEGE_ID будет внешний ключ от TBL_COURSE.

Наконец, имея коллекцию Course в College, а также College идентификатор в Course, вы подразумеваете, что вы хотите bidirectional association. Среди других последствий этого, вы не должны иметь ID колледжа в Course. Вы должны просто иметь ссылку College. Если вам не нужно перемещаться с Course ->College, вы можете удалить это на данный момент, пока не получите более полное представление о сопоставлении объектов Hibernate.

+0

Не нужно определить OneToMany аннотацию и т.д .. это достаточно, чтобы удалить ID аннотацию из embedde d класса. Конечно, аннотацию GeneratedValue также следует удалить. – asch

+0

@asch - Это правда, если вы предполагаете, что OP не хочет, чтобы Курсы были объектами первого класса. Учитывая приведенные таблицы, удаление аннотации ID вызовет проблемы. – sharakan

+0

Курсы уже аннотируются как Embeddable, поэтому в любом случае это не Entity (я предполагаю, что вы это подразумеваете под «объектом первого класса») – asch

0

Вы должны определить присоединиться около двух Pojo

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

Хотя мой подход не является правильным, но до сих пор он работал с некоторыми незначительными изменениями в коде,

первую очередь я уронил таблицу TBL_COURSE и создал новую, как следует,

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

здесь вы можете увидеть, что я удалил первичный ключ, теперь есть только ссылочный ключ и имя,

Теперь в курсе.Java, я сделал следующее,

@Embeddable 
public class Course { 

// constuctor 

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

Вот я удалил @Id аннотации и свойство ID, я даже удалил отображение College_Id,

и остальную часть коды является таким же, как в настоящее время College.java ,

И это сработало,

Ожидание мнений

+0

Это прекрасно, если вы хотите, чтобы «Курс» имел свой жизненный цикл, определенный «Колледж» , а не быть автономной организацией. Вы также не сможете подклассифицировать «Курс» и т. Д. – sharakan