@ElementCollection @CollectionTable em um a muitos mapeamento

estou a tentar uma relação entre a App usando uma anotação incorporada, mas não sou capaz de a executar com sucesso,

Aqui o meu Script sql de Base de dados é o seguinte,

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

Aqui está o código abaixo para a APP,

@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
}
Aqui está o mapeamento da Faculdade.
@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",joinColumns=@JoinColumn(name="COLLEGE_ID"))
   private Set<Course> course;
   ..
   // getter and setter
}
Mas se eu tentar persistir na faculdade com a colecção de cursos, dá-me uma excepção.
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

....
..
Pode dizer-me se a minha abordagem está errada?, Ou a minha compreensão para @CollectionTable é ainda é mínimo., Se eu estava errado
Author: Rahul Shivsharan, 2013-03-14

3 answers

Porque ambas as vossas mesas têm as suas próprias colunas {[[0]}, o Hibernate quer que ambas sejam @Entity tipos. @Embeddables não têm o seu próprio {[[0]}. Assim, o primeiro passo é mudar Course para @Entity, com @TableName correspondente, etc.

Isto nos leva à segunda questão, que é a de que a coleção de Course objetos não deve ser um @ElementCollection, deve ser um @OneToMany coleção de entidades, com um @JoinColumn especificando que COLLEGE_ID vontade é a chave externa de TBL_COURSE.

Finalmente., ao ter uma colecção de Course em College, bem como um id College em Course, está a insinuar que quer uma associação bidireccional {[[27]}. Entre outros impactos disso, você não deve ter o {[[0]} do colégio em Course. Você deve simplesmente ter a referência College. Se você não precisa navegar de Course->College, Você pode querer remover isso por agora, até que você ganhou uma melhor compreensão do Mapeamento de objetos do Hibernate.
 7
Author: sharakan, 2013-03-14 13:09:27

Tens de definir a junção acerca de dois pojo

@OneToMany
@JoinColumn(name=course table column id)
private Set<Course> course;
 0
Author: muthu, 2013-03-14 12:34:14
Apesar da minha abordagem não ser adequada, mas funcionou com algumas pequenas alterações no código.

Em primeiro lugar, deixei cair a tabela TBL_COURSE e criei uma nova, como se segue,

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

Aqui você pode ver que eu removi a chave primária, agora só existe a chave de referência e o nome,

Agora em curso.java, eu segui,
@Embeddable
public class Course {

// constuctor

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

Aqui removi a anotação @Id e a propriedade id, até removi o mapeamento College_ ID,

E o resto do Código é igual ao presente na Faculdade.java,

E funcionou.

À espera das opiniões

 0
Author: Rahul Shivsharan, 2013-03-14 13:40:07