Java @OneToOne作为多个OneType返回
我有以下几点建议:Java @OneToOne作为多个OneType返回,java,hibernate,one-to-one,Java,Hibernate,One To One,我有以下几点建议: public class SampleBean1 { @Id @GeneratedValue(generator = "system-uuid") @GenericGenerator(name = "system-uuid", strategy = "uuid") protected String id; @OneToOne(cascade=CascadeType.ALL) @JoinColumn(name="OneToOn
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;
...
}
}
以下是我得到的反馈:
SB1.oneToOne=SB2
SB2.oneToOne=SB3
SB3.oneToOne=null
多通=假
oneToOne=错误
在调试器中,“oneToOne”的类型是ManyToOneType!!是我做错了什么,还是这是一个休眠缺陷
编辑:以下是OneTONE的工作原理。让我们创建三个SampleBean(SB1、SB2、SB3),如下面的注释所述。首先,POJO格式的数据:
ID|OneToOneID
1|2
2|3
3|null
SB1.oneToOne=SB2
SB2.OneTONE=SB3
SB3.oneToOne=null
再次以数据库形式显示数据:
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");
}
}
ID | OneToOneID
1|2
2|3
3 |零
只要OneToOneID有唯一的约束,这种类型的关系会是OneToOne吗?有没有其他方法来模拟OneTONE?注意,上面的POJO是单向的。这就是问题所在吗?现在更清楚了,谢谢
在这两种情况下(例如实体本身和OneToOne映射属性),它真的是
SampleBean1
,还是打字错误?如果它们是相同的,我很确定这是非法的(你认为映射会如何工作)?我有点惊讶它被悄悄地降级为“多对一”,而不是抛出错误,但也许这就是Hibernate Annotations mapper所做的。现在更清楚了,谢谢
在这两种情况下(例如实体本身和OneToOne映射属性),它真的是
SampleBean1
,还是打字错误?如果它们是相同的,我很确定这是非法的(你认为映射会如何工作)?我有点惊讶它被悄悄地降级为“多对一”,而不是抛出错误,但也许这就是Hibernate Annotations mapper所做的。更多可能性
更有可能
SampleBean1映射到每个关系上的自身。我想这会让测试更容易。在冬眠状态下,你能不能和自己保持一种一对一的关系?在SQL中,您只需添加一个外键,一切正常。因此,假设您有三个SampleBean1-SB1、SB2和SB3实例。SB1的oneToOne属性指向SB2主键。SB2的oneToOne属性指向SB3主键。现在,SB2与-SB1或SB3一对一是哪一个“一”:)这就是为什么它是非法的。如果您有两个实体,A和B,它们之间有1对1的关系,该怎么办。如果A1和A2都指向B1怎么办?B1与哪个“一对一”匹配?我想如果你提出的观点是非法的,那不是因为你举的例子。@Andre-你的例子不是一对一的关系。它是从A到B的多对一或从B到A的一对多你可以随时检查实际的注释。您知道属性名称和类;使用反射获取字段和
get
方法(在两者之间进行选择可能会有问题;我建议您同时选中两者),然后在其上调用setAccessible()
,然后调用getAnnotation(OneToOne.class)
。如果后者不返回NULL,则将其标记为OneToOne
。不过,我会对此保持谨慎——事实上,Hibernate悄悄地将非法的OneToOne“降级”为ManyToOne对我来说似乎相当不确定,这很可能在未来发生变化。SampleBean1在每个关系上都映射到自己。我想这会让测试更容易。在冬眠状态下,你能不能和自己保持一种一对一的关系?在SQL中,您只需添加一个外键,一切正常。因此,假设您有三个SampleBean1-SB1、SB2和SB3实例。SB1的oneToOne属性指向SB2主键。SB2的oneToOne属性指向SB3主键。现在,SB2与-SB1或SB3一对一是哪一个“一”:)这就是为什么它是非法的。如果您有两个实体,A和B,它们之间有1对1的关系,该怎么办。如果A1和A2都指向B1怎么办?B1与哪个“一对一”匹配?我想如果你提出的观点是非法的,那不是因为你举的例子。@Andre-你的例子不是一对一的关系。它是从A到B的多对一或从B到A的一对多你可以随时检查实际的注释。您知道属性名称和类;使用反射获取字段和get
方法(在两者之间进行选择可能会有问题;我建议您同时选中两者),然后在其上调用setAccessible()
,然后调用getAnnotation(OneToOne.class)
。如果后者不返回NULL,则将其标记为OneToOne
。不过,我会对此保持谨慎——事实上,Hibernate悄悄地将非法的OneToOne“降级”为ManyToOne对我来说似乎相当不确定,这很可能在未来发生变化。
ID|OneToOneID
1|2
2|3
3|null
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");
}
}