让我们考虑一个事务类
@Entity
public class Transaction {
@ManyToOne(fetch = FetchType.EAGER)
private Business business;
@Column(name = "business_code")
private String businessCode;
}
使用 byBusinessCode(表 Transaction 中的一列)或使用 byBusiness 来按业务获取事务(作为 Transaction 类中的依赖项)的整个对象 Business 哪种方法更有效?
“表中的列”和“整个对象”之间没有概念上的区别:“整个对象”也是表中的列!
如果你看看实际的数据库模式,我们有类似的东西
+-------------+ +-------------+
|Transaction | | Business |
+-------------+ +-------------+
|business_id |------>| business_id |
|business_code| | ... |
+-------------+ +-------------+
如果您按业务实体查询,hibernate 会将其转换为 SQL 查询
select ... from Transaction where business_id = ?
如果你通过代码查询,hibernate会将其翻译为
select ... from Transaction where business_code = ?
如您所见,SQL 的结构是相同的。因此,性能将取决于通常的事情,最值得注意的是该字段上是否有合适的索引(hibernate 自动为主键和外键创建索引,但可能需要为其他列手动创建),并且在较小程度上取决于涉及字段的数据类型。
(如果关系是
@OneToOne(mappedBy = ...)
另一个表,答案会有所不同。然后,数据库架构将如下所示
+-------------+ +-------------+
|Transaction | | Business |
+-------------+ +-------------+
|business_id |<------| business_id |
|business_code| | ... |
+-------------+ +-------------+
按业务查询交易将转化为
select ...
from Business
left join Transaction on Busness.business_id = Transaction.business_id
where business_id = ?
并且该连接会给数据库带来额外的工作,这可能会影响性能。但是
@ManyToOne
不能使用 mappedBy
,所以这不会发生在你的情况下。
顺便说一句,您可以通过打开 Hibernate 的 SQL 日志记录轻松检查您的查询正在被转换成什么。