1
請考慮以下具有兩個ManyToOne引用的父類。HIbernate獲取連接發出額外的SQL語句
@Entity
@Table(name = "PARENT")
public class Parent {
private static final long serialVersionUID = 3730163805206219313L;
@Id
@SequenceGenerator(name = "SEQ#PARENT", sequenceName = "SEQ#PARENT", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ#PARENT")
@Column(name = "ID")
private long id;
@ManyToOne(optional = false, fetch=FetchType.EAGER)
@Fetch(FetchMode.JOIN)
@JoinColumn(name="CHILD_1_ID", referencedColumnName="FK_COLUMN_NAME")
private Child childInstance1;
@ManyToOne(optional = false, fetch=FetchType.EAGER)
@Fetch(FetchMode.JOIN)
@JoinColumn(name="CHILD_2_ID", referencedColumnName="FK_COLUMN_NAME")
private Child childInstance2;
@Column(name = "USER_ID")
private String userId;
}
我使用下面的HQL查詢加載父實例:
"from Parent p join fetch p.childInstance1 join fetch p.childInstance2 where p.userId = :userId"
這總是導致休眠發出單獨的SQL語句來加載,即使它纔會在獲取加入childInstance1行。
任何幫助避免額外的SQL語句表示讚賞。
其實我發現問題...好像在你的測試中你忽略了引起問題的referencedColumnName。我正在引用一個非主鍵列。一旦我修改了referencedColmumnName作爲子鍵的主鍵列,額外的sql語句就消失了。 – Sasi 2010-09-21 21:27:53
@Sasi我沒有忽略它,我使用了默認:)(因爲我不知道FK_COLUMN_NAME是什麼,因爲我喜歡默認設置)。但是,如果您指定它,它確實是被引用表的PK列。 – 2010-09-21 21:36:53