@OnetoOne sendo devolvido como ManyTooneType
-
21-09-2019 - |
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?
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");
}
}