假设我有两个表: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会话。