我们曾经使用过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关系而不是单独的选择?