1

我有以下 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(并进行适当的操作)。它总是以多对一的形式返回。

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

}

这是我回来的:

多对一=假
oneToOne=false

在调试器中,“oneToOne”的类型是 ManyToOneType!!我做错了什么还是这是休眠缺陷?

编辑:这是 OneToOne 的工作方式。让我们创建三个 SampleBeans(SB1、SB2、SB3),如下面的评论中所述。一、POJO形式的数据:

SB1.oneToOne=SB2
SB2.oneToOne=SB3
SB3.oneToOne=null

再次以数据库形式的数据:

ID|OneToOneID
1|2
2|3
3|空

只要 OneToOneID 具有唯一约束,这种类型的关系会是 OneToOne 吗?是否有另一种方法来建模 OneToOne?请注意,上面的 POJO 是单向 OneToOne。这可能是问题吗?

4

2 回答 2

1

现在清楚多了,谢谢。

是真的SampleBean1在这两种情况下(例如实体本身和 OneToOne 映射属性)还是一个错字?如果它们相同,我很确定这是非法的(您如何想象映射会起作用)?我有点惊讶它被悄悄降级为“多对一”而不是抛出错误,但也许这就是 Hibernate Annotations 映射器所做的。

于 2009-09-04T23:15:55.200 回答
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");
            }
        }
于 2013-04-05T17:41:12.520 回答