@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
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
.
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.
Tens de definir a junção acerca de dois pojo
@OneToMany
@JoinColumn(name=course table column id)
private Set<Course> course;
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