Hibernate:如何使用Left Join

时间:2015-04-25 10:11:04

标签: java hibernate join hibernate-mapping lazy-initialization

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

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

考虑到TableA的实体有一个属性" tableB"使用注释@OneToOne声明的TableB实体,如何创建查询?

这是正确的查询吗?

  

从tableA中选择一个左连接获取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会话。

0 个答案:

没有答案