@OneToOne返回为ManyToOneType

时间:2009-09-04 22:52:01

标签: java hibernate one-to-one

我有以下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。这可能是问题吗?

2 个答案:

答案 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");
            }
        }