一尘不染

@OneToOne返回为ManyToOneType

hibernate

我有以下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");
}

}

这是我得到的:

manyToOne = false
oneToOne =假

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

编辑:这是OneToOne的工作方式。让我们创建三个SampleBeans(SB1,SB2,SB3),如下面的注释所述。首先,以POJO形式的数据:

SB1.oneToOne = SB2
SB2.oneToOne = SB3
SB3.oneToOne =空

再次以数据库形式提供数据:

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

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


阅读 246

收藏
2020-06-20

共1个答案

一尘不染

现在,这要清楚得多,谢谢。

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

2020-06-20