较新版本的Hibernate用额外的查询替换了join

时间:2018-08-22 09:01:48

标签: java hibernate

我们曾经使用过Hibernate 3.6.5(核心,ehcache和c3p0)。 升级到5.1.14后,我发现某些行为更改可能会对我们的性能产生重大影响。

我有两个相关的对象A和B。在Hibernate 3中,加载A会生成一个查询,其中包含对B的联接:

select
    ...
from
    a a0_ 
...
inner join
    b b2_ 
        on a0_.aid=b2_.aid 
...
where
    a0_.aid=1291823;

在Hibernate 5中使用完全相同的映射,我得到三个查询。首先,执行与上述相同的查询,但不加入数字。然后从数字中单独选择:

select
    ...
from
    b b0_ 
where
    b0_.aid=1291823;

我们可以省略第三个查询。它与检查另一个关系的有效性有关。

映射如下,A类:

@Entity
@Table(name="a")
public class A implements java.io.Serializable {

    int aid;

    private B b;

    ...

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="aid", unique=true, nullable=false, insertable=true, updatable=true)
    public int getAid() {
        return this.aid;
    }

    private void setAid(int aid) {
        this.aid = aid;
    }

    ...

    @OneToOne(cascade={CascadeType.MERGE, CascadeType.REFRESH, CascadeType.PERSIST}, optional=false, fetch=FetchType.EAGER, mappedBy="a")
    @Fetch(FetchMode.JOIN)
    public B getB(){
        return b;
    }

    public void setB(B b){
        this.b = b;
    }

    ...
}

还有B级:

@Entity
@Table(name="b", uniqueConstraints = { @UniqueConstraint( columnNames = { ... } ) })
public class B implements java.io.Serializable {

    private int bid;

    private Integer aid;
    private A a;

    ...

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="bid", unique=true, nullable=false, insertable=true, updatable=true)
    public int getBid() {
        return this.bid;
    }

    public void setBid(int bid) {
        this.bid = bid;
    }

    ...

    @Column(name="aid", unique=true, nullable=true, insertable=false, updatable=false)
    public Integer getAid() {
        return this.aid;
    }

    public void setAid(Integer aid) {
        this.aid = aid;
    }

    @OneToOne(fetch=FetchType.LAZY, optional=true, cascade=CascadeType.ALL)
    @JoinColumn(name="aid", unique=true, updatable=true, insertable=true, nullable=true)
    @NotFound(action=NotFoundAction.IGNORE)
    public Account getA(){
        return a;
    }

    public void setA(A a){
        this.a = a;
    }

    ...
}

即使A到B为@ManyToOne,B到A的映射也曾经是@OneToOne。无论哪种方式,我都会得到相同的结果。

我还注意到@Column@JoinColumn在B类中的帮助在可插入等方面不匹配。设置相同的值无济于事。

如何使Hibernate加入B关系而不是单独的选择?

0 个答案:

没有答案