@OneToOne se retourne comme ManyToOneType
-
21-09-2019 - |
Question
Je le POJO suivant:
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 !! Est-ce que je fais quelque chose de mal ou est-ce un défaut Hibernate?
EDIT: Voici comment les ONEtoONE de peut 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
à nouveau 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? Y at-il une autre façon de modéliser OneToOne? Notez que le POJO ci-dessus est destiné OneToOne à sens unique. Serait-ce la question?
La solution
C'est beaucoup plus clair maintenant, je vous remercie.
Est-il vraiment SampleBean1
dans les deux cas (par exemple l'entité elle-même et la propriété OneToOne mappée) ou est-ce une faute de frappe? Si ce sont les mêmes, je suis sûr que c'est illégal (comment imaginez-vous que le mappage fonctionnerait)? Je suis un peu surpris qu'il est tranquillement rétrogradé à « many-to-one » au lieu de lancer une erreur, mais peut-être est ce que Hibernate Annotations cartographe fait.
Autres conseils
Plus d'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");
}
}