8
votes

@ElementCollection @CollectionTable dans une cartographie

J'essaie de la relation entre en JPA à l'aide d'une annotation intégrée, mais je ne suis pas en mesure de l'exécuter avec succès,

Ici, mon script SQL de base de données est comme suit, P>

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

....
..


0 commentaires

3 Réponses :


-3
votes

Vous devez définir la jointure sur deux pojo xxx


0 commentaires

8
votes

Parce que les deux tables ont leurs propres colonnes id , Hibernate voudra qu'ils soient tous deux @entity types. @MedDABLES N'a pas son propre identifiant . Donc, la première étape consiste à modifier cours pour être @entity , avec correspondant @tablename , etc.

Cela conduit au deuxième problème, qui est que la collection de des objets ne devrait pas être un @ElementCollection , il devrait s'agir d'un @Eonetomany Collection d'entités, avec un @JOINCOLUMN spécifiant que college_id est la clé étrangère de tbl_coursous . .

Enfin, en ayant une collection de cours dans college , ainsi qu'un college ID dans cours , vous impliquez que vous voulez un Association bidirectionnelle . Entre autres impacts de cela, vous ne devriez pas avoir le ID du collège dans cours . Vous devriez simplement avoir la référence college . Si vous n'avez pas besoin de naviguer depuis cours -> college , vous voudrez peut-être supprimer cela pour le moment, jusqu'à ce que vous ayez acquis une meilleure compréhension de la cartographie des objets Hibernate.


3 commentaires

Non nécessaire de définir l'annotation ecence de l'OneTomanan, etc. Il suffit de supprimer l'annotation d'identifiant de la classe intégrée. Bien entendu, l'annotation généralisée devait également être supprimée.


@Asch - c'est vrai, si vous supposez que l'OP ne voulait pas que des cours soient des objets de première classe. Compte tenu des tables telles que définies, en supprimant l'annotation d'identification entraînerait des problèmes.


Les cours sont déjà annotés comme intégrés. Ce n'est donc pas l'entité de toute façon (je suppose que vous voulez dire cela par "l'objet de première classe")



0
votes

Bien que mon approche ne soit pas convenable mais que cela a toujours fonctionné avec des modifications mineures dans le code,

Tout d'abord, j'ai laissé tomber la table TBL_Coursours et créé un nouveau, comme suit, P>

@Embeddable
public class Course {

// constuctor

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


1 commentaires

C'est bien, tant que vous voulez Course Pour que ce soit le cycle de vie défini par college , et ne pas être une entité autonome. Vous ne pourrez pas non plus sousclure cours , etc.