2009-09-04 7 views
1

ManyToOneType je le POJO suivant:@OneToOne se retourne comme


public class SampleBean1 { 
    @Id 
    @GeneratedValue(generator = "system-uuid") 
    @GenericGenerator(name = "system-uuid", strategy = "uuid") 
    protected String id; 

    @OneToOne(cascade=CascadeType.ALL) 
    @JoinColumn(name="OneToOneID") 
    protected SampleBean1 oneToOne; 

    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY) 
    @JoinColumn(name="OneToManyID") 
    protected List<SampleBean1> oneToMany; 

    @ManyToOne(cascade=CascadeType.ALL) 
    @JoinColumn(name="ManyToOneID") 
    protected SampleBean1 manyToOne; 

    @ManyToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER) 
    @JoinTable(name="SampleBeanManyToMany", 
      joinColumns={@JoinColumn(name="LeftID")}, 
      inverseJoinColumns={@JoinColumn(name="RightID")}) 
    @IndexColumn(name="ManyToManyIndex") 
    protected List<SampleBean1> manyToMany; 

    ... 
} 

Je fais une bibliothèque pour détecter OneToOne ou ManyToOne (et faire des opérations appropriées). Il revient toujours comme ManyToOne.

 
//Get the class' metadata 
ClassMetadata cmd=sf.getClassMetadata(o.getClass());

for(String propertyName:cmd.getPropertyNames()){ org.hibernate.type.Type propertyType=cmd.getPropertyType(propertyName);

//Handle ___ToOne 
if (propertyType.isEntityType()){ 
    EntityType et=(EntityType)propertyType; 
    System.out.printf("%s=%s\n",propertyName,et.isOneToOne()?"true":"false"); 
} 

}

Voici ce que je reviens:

 
manyToOne=false 
oneToOne=false 

Dans le débogueur le type de la "ONEtoONE" est ManyToOneType !! Ai-je fait quelque chose de mal ou est-ce un défaut d'Hibernate?

EDIT: Voici comment les OneToOne peuvent fonctionner. Créons trois SampleBeans (SB1, SB2, SB3) comme décrit dans un commentaire ci-dessous. Tout d'abord, les données sous forme de POJO:

 
SB1.oneToOne=SB2 
SB2.oneToOne=SB3 
SB3.oneToOne=null 

Encore une fois les données sous forme de base de données:

 
ID|OneToOneID 
1|2 
2|3 
3|null 

Tant que OneToOneID a une contrainte unique, serait ce type de relation est OneToOne? Existe-t-il un autre moyen de modéliser OneToOne? Notez que le POJO ci-dessus est destiné à OneToOne unidirectionnel. Cela pourrait-il être le problème?

Répondre

1

C'est beaucoup plus clair maintenant, merci.

Est-ce vraiment SampleBean1 dans les deux cas (par exemple entité elle-même et la propriété mappée OneToOne) ou est-ce une faute de frappe? S'ils sont pareils, je suis à peu près sûr que c'est illégal (comment imaginez-vous que la cartographie fonctionnerait)? Je suis un peu surpris qu'il soit discrètement rétrogradé à «plusieurs-à-un» au lieu de lancer une erreur, mais c'est peut-être ce que fait le mappeur Hibernate Annotations.

+0

SampleBean1 est mis en correspondance avec lui-même sur chaque relation. Je pensais que cela rendrait le test plus facile. Ne pouvez-vous pas avoir une relation OneToOne avec vous-même dans Hibernate? En SQL, vous pouvez simplement ajouter une clé étrangère et tout va bien. – User1

+0

Donc disons que vous avez trois instances de SampleBean1 - SB1, SB2 et SB3. La propriété oneToOne de SB1 pointe vers SB2 PK. La propriété oneToOne de SB2 pointe vers SB3 PK. Maintenant, lequel "one" est SB2 one-to-one avec - SB1 ou SB3? :-) C'est pourquoi c'est illégal. – ChssPly76

+0

Bien. Que faire si vous avez deux entités, A et B, avec des relations 1-à-1 les uns aux autres. Que faire si A1 et A2 pointent vers B1? Quel "un" est B1 one-to-one avec? Je suppose que si le point que vous avez proposé est illégal, ce n'est pas à cause de l'exemple que vous avez donné. –

0

Plus une possibilité

 if (propertyType.isEntityType()) { 
      EntityType entityType = (EntityType) propertyType; 

      if (entityType instanceof ManyToOneType) { 
       System.out.println("this is ManyToOne"); 
      } else if(entityType instanceof OneToOneType) { 
       System.out.println("this is OneToOne"); 
      } 
     } 
Questions connexes