Pregunta

Tengo el siguiente POJO:


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;

    ...
}

Estoy haciendo una biblioteca para detectar OneToOne o ManyToOne (y haciendo operaciones apropiadas). Siempre se vuelve tan 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");
}

}

Esto es lo que yo vuelva:

manyToOne=false
oneToOne=false

En el depurador del tipo de la "OneToOne" es ManyToOneType !! ¿He hecho algo mal o se trata de un defecto de hibernación?

EDIT: Así es como los OneToOne de puede trabajar. Vamos a crear tres SampleBeans (SB1, SB2, SB3) como se describe en un comentario más abajo. En primer lugar, los datos en forma POJO:

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

de nuevo los datos en forma de base de datos:

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

Mientras OneToOneID tiene una restricción única, sería este tipo de relación se OneToOne? ¿Hay otra manera de modelar OneToOne? Tenga en cuenta que el POJO anterior pretende unidireccional OneToOne. Podría ser el problema?

¿Fue útil?

Solución

Eso es mucho más claro ahora, gracias.

¿Es realmente SampleBean1 en ambos casos (por ejemplo propia entidad y la OneToOne asigna la propiedad) o se trata de un error tipográfico? Si son lo mismo, estoy bastante seguro de que es ilegal (¿cómo se imagina que la cartografía funcionaría)? Estoy un poco sorprendido se rebajó en voz baja a "muchos-a-uno" en lugar de tirar un error, pero tal vez eso es lo que hace anotaciones de Hibernate asignador.

Otros consejos

Más una posibilidad

        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");
            }
        }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top