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?

Était-ce utile?

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");
            }
        }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top