@OneToOne immer als ManyToOneType zurück
-
21-09-2019 - |
Frage
Ich habe folgendes 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;
...
}
Ich mache eine Bibliothek OneToOne oder ManyToOne (und tun geeignete Operationen) zu erfassen. Es kommt immer wieder als 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"); }
}
Hier ist, was ich zurück:
manyToOne=false oneToOne=false
In der Debugger die Art des "OneToOne" ist ManyToOneType !! Habe ich etwas falsch gemacht oder ist dies ein Hibernate Defekt?
EDIT: Hier ist, wie die Dose Arbeit OneToOne. Lassen Sie uns erstellen drei SampleBeans (SB1, SB2, SB3), wie unten in einem Kommentar beschrieben. Zuerst werden die Daten in POJO Form:
SB1.oneToOne=SB2 SB2.oneToOne=SB3 SB3.oneToOne=null
Auch hier sind die Daten in der Datenbank Form:
ID|OneToOneID 1|2 2|3 3|null
Solange OneToOneID eine eindeutige Einschränkung hat, würde diese Art von Beziehung OneToOne sein? Gibt es eine andere Art und Weise OneToOne zu modellieren? Beachten Sie, dass die POJO oben ist unidirektional OneToOne vorgesehen. Könnte sein, dass das Problem sein?
Lösung
Das ist jetzt viel klarer, danke.
Ist es wirklich in beiden Fällen SampleBean1
(zum Beispiel Unternehmen selbst und die OneToOne abgebildet Eigenschaft) oder ist es ein Tippfehler? Wenn sie gleich sind, bin ich ziemlich sicher, dass es illegal ist (wie stellst du dir das Mapping funktionieren würde)? Ich bin ein bisschen überrascht es ruhig zu „many-to-one“ degradiert, anstatt einen Fehler zu werfen, aber vielleicht das ist, was Hibernate Annotations Mapper der Fall ist.
Andere Tipps
Mehr eine Möglichkeit,
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");
}
}