J'utilise une base de données Derby et Hibernate pour extraire des colonnes de table dans des champs de classe Java. Lorsque vous extrayez des données pour une classe appelée CourseCredits.class
, j'obtiens une exception MappingException. En effet, la colonne avec le nom Cours est de type VARCHAR(30)
et le champ de classe correspondante est de type Course.class
:Rediriger la valeur de la base de données vers le champ d'un autre objet
@Entity
@Table(name="CourseCredits")
public class CourseCredit implements Serializable {
@Id
@Column(name="Course")
private Course course;
public CourseCredit(){
}
// getters and setters
}
Si je change la variable globale course
à un type de chaîne, le programme fonctionne comme prévu:
@Entity
@Table(name="CourseCredits")
public class CourseCredit implements Serializable {
@Id
@Column(name="Course")
private String course;
...
}
Étant donné que la classe Course.class
ressemble à ceci:
public class Course {
private String name;
...
}
Est-il possible de stocker la chaîne de la colonne de cours dans une instance de Course.class
, en particulier à la variable globale name
?
Mise à jour
Suite à la suggestion de Bartosz, les classes regardent maintenant comme ceci:
@Entity
@Table(name="CourseCredits")
public class CourseCredit implements Serializable {
@Id
@OneToOne
@JoinColumn(name = "CourseId")
private Course course;
...
}
@Entity
public class Course implements Serializable{
@Id
@Column(name="CourseId")
private String name;
...
}
J'ai fait une entité de Course.class
depuis la mise en correspondance d'association précise les relations entre les entités . Malheureusement, l'erreur n'est pas encore résolue. Maintenant, je reçois une erreur ERROR 42X04
. Voici ce que je lance:
em.getTransaction().begin(); // em is the entity manager
List<CourseCredit> credits = this.em.createQuery("from CourseCredit").getResultList();
Le problème ne réside pas dans ce code d'exécution, le programme fonctionne très bien si j'utilise un champ de type String au lieu de Course
. La sortie d'erreur que je reçois est:
Caused by: java.sql.SQLSyntaxErrorException: Column 'COURSECRED0_.COURSEID' is either not in any table in the FROM list or appears within a join specification and is outside the scope of the join specification or appears in a HAVING clause and is not in the GROUP BY list. If this is a CREATE or ALTER TABLE statement then 'COURSECRED0_.COURSEID' is not a column in the target table.
at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source)
at org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown Source)
at org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedConnection.handleException(Unknown Source)
at org.apache.derby.impl.jdbc.ConnectionChild.handleException(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedPreparedStatement.<init>(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedPreparedStatement42.<init>(Unknown Source)
at org.apache.derby.jdbc.Driver42.newEmbedPreparedStatement(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedConnection.prepareStatement(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedConnection.prepareStatement(Unknown Source)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$5.doPrepare(StatementPreparerImpl.java:146)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:172)
... 19 more
Il semble se plaindre d'une colonne non-existante (CourseId
), ce qui serait vrai. Je ne connais pas du tout les bases de données, alors pardonnez-moi si c'est une question de débutant, mais quelle est la signification du nom CourseId
dans @JoinColumn
? Il semble indiquer un nouveau nom de colonne. Je le vois utilisé dans tous les exemples que je peux trouver, mais il n'est jamais référencé après l'avoir défini.
J'ai lu la documentation et ajusté le programme (voir la mise à jour en question). Malheureusement, cela ne règle pas tout à fait le problème.Au contraire, il ne se plaint que lorsque j'essaie d'interroger la table maintenant. Pourriez-vous expliquer la signification de 'course_id' dans' @ JoinColumn'? De la documentation il semble se rapporter à un nom de colonne d'une table 'Course', mais il n'y a aucune telle table. – Babyburger
lors de l'utilisation d'associations, table liée (malédiction pour vous) doit exister. vous pouvez le créer manuellement ou générer un schéma db à partir d'annotations Hibernate. –