Pergunta

Eu tenho o seguinte 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;

    ...
}

Estou fazendo uma biblioteca para detectar onetoone ou muitostoOne (e fazendo operações apropriadas). Ele sempre volta como muitos.

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

para (String PropertyName: cmd.getPropertyNames ()) {org.hibernate.type.type PropertyType = cmd.getPropertype (PropertyName);

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

}

Aqui está o que eu recebo de volta:

manyToOne=false
oneToOne=false

No depurador, o tipo de "OnetoOne" é ManyTooneType !! Eu fiz algo errado ou isso é um defeito de hibernação?

EDIT: Veja como os Onetoone podem funcionar. Vamos criar três samplebeans (SB1, SB2, SB3), conforme descrito em um comentário abaixo. Primeiro, os dados em forma de POJO:

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

Novamente os dados no formulário de banco de dados:

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

Enquanto o OnetoOneid tiver uma restrição única, esse tipo de relação seria onetoone? Existe outra maneira de modelar o OnetoOne? Observe que o Pojo acima se destina a Onetoone unidirecional. Que poderia ser o problema?

Foi útil?

Solução

Isso é muito mais claro agora, obrigado.

É realmente SampleBean1 Nos dois casos (por exemplo, a própria entidade e a propriedade mapeada de OnetoOne) ou é um erro de digitação? Se eles são iguais, tenho certeza de que é ilegal (como você imagina que o mapeamento funcionaria)? Estou um pouco surpreso que seja silenciosamente rebaixado para "muitos para um" em vez de jogar um erro, mas talvez seja isso que o Hibernate Anotações que o Mapper faz.

Outras dicas

Mais uma possibilidade

        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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top