我有以下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;
...
}
我正在建立一个库来检测OneToOne或ManyToOne(并进行适当的操作)。它总是以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"); }
//Handle ___ToOne if (propertyType.isEntityType()){ EntityType et=(EntityType)propertyType; System.out.printf("%s=%s\n",propertyName,et.isOneToOne()?"true":"false"); }
以下是我的回复:
manyToOne=false oneToOne=false
在调试器中,“oneToOne”的类型是ManyToOneType !!我做错了什么或者这是一个Hibernate缺陷吗?
编辑:以下是OneToOne的工作原理。让我们创建三个SampleBeans(SB1,SB2,SB3),如下面的评论中所述。首先,POJO形式的数据:
SB1.oneToOne=SB2 SB2.oneToOne=SB3 SB3.oneToOne=null
数据库形式的数据:
ID|OneToOneID 1|2 2|3 3|null
只要OneToOneID具有唯一约束,这种关系类型是OneToOne吗?还有另一种模拟OneToOne的方法吗?请注意,上面的POJO是单向OneToOne。这可能是问题吗?
答案 0 :(得分:1)
现在更清楚了,谢谢。
两种情况下都是SampleBean1
(例如实体本身和OneToOne映射属性)还是错字?如果它们是相同的,我很确定它是非法的(你怎么想象映射会起作用)?我有点惊讶它被悄然降级为“多对一”而不是抛出错误,但也许这就是Hibernate Annotations mapper所做的。
答案 1 :(得分:0)
更有可能
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");
}
}