2017-04-25 2 views
1

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.

Répondre

2

Des associations sont utilisées pour cela.

Vous devez décider de cardinalité (one-to-one? Many-to-many?)

En supposant un à un et votre cas, vous devez

@OneToOne 
@JoinColumn(name = "course_id") 
private Course course; 

Lors de l'utilisation des associations, table liée (malédiction dans votre cas) doit exister. vous pouvez le créer manuellement ou générer un schéma db à partir d'annotations Hibernate.

La documentation Hibernate contient des exemples pour tous les cas. La documentation inclut la structure de table sous-jacente. Voir plus de détails http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#associations

+0

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

+1

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. –