2017-07-25 1 views
0

J'ai deux tables avec le schéma comme suit:Unidirectionnel JPA OneToMany Mapping - ORA-01722: numéro invalide

Tableau 1

table1_id (pk) (entier)

Nom

Tableau2

table2_id (pk) (Chaîne)

table1_id (pk) (entier)

Nom

Mon code ressemble à ceci

@Entity 
@Table(name = "Table2") 
class Table2 { 

    @Id 
    @Column(name = "table2_id") 
    private String id; 

    @Column(name="name") 
    private String name; 

    @OneToMany 
    @JoinColumn (name="table1_id") 
    private Set<Table1> table1Set = new HashSet<>(); 


    //setters and getters 
} 

@Entity 
@Table(name = "Table1") 
class Table1 { 

    @Id 
    @Column(name = "table1_id") 
    private int id; 

    @Column(name="name") 
    private String name; 

    //setters and getters 
} 

Maintenant, quand je la recherche: Table2Repository.findById("One"):

je reçois ci-dessous erreur:

Hibernate: select table2.id as table2_id_1_, table2.name as name2_1_ from table2 table20_ 
Hibernate: select table10_.table1_id as table1_id1_1_0_, table1_.table1_id as table1_id1_0_0_, table10_.table1_id as table1_id1_0_1_, table10_.name as name2_0_1_ from table1 table10_ where table10_.table1_id=? 
2017-07-25 12:53:11.352 WARN 11572 --- [   main] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 1722, SQLState: 42000 
2017-07-25 12:53:11.352 ERROR 11572 --- [   main] o.h.engine.jdbc.spi.SqlExceptionHelper : ORA-01722: invalid number 

Il semble qu'il y ait une discordance. Il semble utiliser String "table2_id" pour interroger Table1, où il devrait utiliser "table1_id"

Veuillez aider!

+0

Il y a un conflit de noms dans votre application: '@JoinColumn (name = "table1_id") 'sur' Table2.table1Set' vs '@Id @Column (name =" table1_id ")' sur 'Table1.id'. Notez que la colonne de jointure va dans Table1, ** pas ** 'Table2'. – crizzis

+0

@crizzis, je me suis rendu compte que la colonne de jointure devrait être dans le «beaucoup» la table latérale c.-à-d. Tableau 1 . Cependant, ce schéma de base de données est ancien et la modification peut ne pas être facile. Est-il de toute façon pour le faire fonctionner sans déplacer la colonne de jointure à Table1? Merci. – Surbhi

+0

Je ne pense pas que je suis. Comment pouvez-vous avoir une association * un-à-plusieurs * avec la colonne de jointure du côté * un *? Quand il y a plus d'un 'Table1' associé à' Table2', où prévoyez-vous stocker leurs identifiants? – crizzis

Répondre

0

Il existe un conflit de noms dans votre mappage: @JoinColumn (name="table1_id") sur Table2.table1Set par rapport à @Id @Column(name = "table1_id") sur Table1.id. Notez que la colonne de jointure va dans Table1, pasTable2.

Qu'est-ce que vous voulez dire sans doute est un schéma comme celui-ci: PERSON(id, name, age, a_bunch_of_other_stuff), PERSON_PHONE_NUMBER(person_id, phone_id), PHONE_NUMBER(id, phone_number), dans ce cas, votre cartographie devrait ressembler à ce qui suit:

@Entity 
@Table(name = "PERSON") 
public class Person { 

    @Id 
    private int id; 

    private String name; 
    ... 

    @OneToMany 
    @JoinTable(name = "PERSON_PHONE_NUMBER", 
     joinColumns = @JoinColumn(name = "PERSON_ID", referencedColumnName = "ID"), 
     inverseJoinColumns = @JoinColumn(name = "PHONE_ID", referencedColumnName = "ID") 
    ) 
    private Set<PhoneNumber> phoneNumbers; 
    ... 
} 

@Entity 
@Table(name = "PHONE_NUMBER") 
public class PhoneNumber { 

    @Id 
    private String id; 

    @Column(name = "PHONE_NUMBER") 
    private String phoneNumber; 
    ... 
} 
+0

Merci pour la réponse.Dans mon cas, il n'y a pas de JoinTable: PERSON_PHONE_NUMBER (person_id, phone_id). Mon schéma est quelque chose comme ceci: PERSON (id (clé primaire), phone_id (clé primaire), nom, âge, a_bunch_of_other_staff) et PHONE_NUMBER (id, phone_number). – Surbhi

+0

Le schéma que vous décrivez n'a pas de sens. Cela voudrait dire que chaque fois qu'une personne a plus d'un téléphone, les données de cette personne (nom, âge, etc.) sont dupliquées dans la table «PERSON». Il n'y a aucun moyen de mapper un tel schéma dans JPA autre que d'établir une relation un-à-un entre 'Person' et' PhoneNumber' et, bien, d'accepter le fait que plusieurs entités 'Person' existera pour une seule personne réelle – crizzis

+0

Bien sûr, le téléphone et la personne ne sont que des exemples, donc il peut sembler que les mêmes données sont dupliquées. Cependant, dans mon cas, les lignes ont des valeurs différentes des autres colonnes pour les permutations différentes de deux clés. Il n'y a pas de répétition de données dans des lignes différentes. Cela me fait réellement repenser la relation est en réalité ManyToMany. Va vérifier si le problème résout avec ça. Merci! – Surbhi