假设我有两个表:TableA和TableB . TableA和TableB在两个字段(fieldA1和fieldA2 over fieldB1和fieldB2)上的@OneToOne关系中,并且TableA的所有实例都不存在这种关系 .

我想用Hibernate做的是让所有出现的TableA与TableB的出现有或没有关系 . 为此,我显然必须使用左连接 .

考虑到TableA的实体具有使用注释@OneToOne声明的TableB实体的属性“tableB”,我该如何创建查询?

这是正确的查询吗?

从表中选择一个左连接获取a.tableB

我的这个查询的问题是,当tableA的某些行与TableB的任何行没有匹配时,Hibernate会抛出一个依赖于我使用的注释(fetch = EAGER或LAZY)的异常 .

我发布我的代码更清楚:

@Entity
@Table(name = "TABLE_A")
public class TableA extends EvoluzioneStati implements Serializable {

    private static final long serialVersionUID = 1L;

    @OneToOne
    @JoinColumns({
        @JoinColumn(name = "ID", referencedColumnName = "ID", insertable=false, updatable=false),
        @JoinColumn(name = "NUM", referencedColumnName = "NUM", insertable=false, updatable=false) })
    private TableB tableB;
other code here...

如果我使用LAZY注释,查询处理正常,但是当我尝试访问tableB对象以检查它是否为null时,会发生LazyInitialization异常 . 相反,当我使用EAGER注释时,它会在处理查询期间抛出异常,因为某些事件的TableA在TableB中没有匹配 . 我确切地说,由于项目组成和配置,当我返回查询结果时,我无法初始化Hibernate会话 .