哪种方法使用 hibernate 更有效

问题描述 投票:0回答:1

让我们考虑一个事务类

 @Entity
    public class Transaction {
    
    @ManyToOne(fetch = FetchType.EAGER)
    private Business business;
    
        @Column(name = "business_code")
        private String businessCode;
    
    
    }

使用 byBusinessCode(表 Transaction 中的一列)或使用 byBusiness 来按业务获取事务(作为 Transaction 类中的依赖项)的整个对象 Business 哪种方法更有效?

java hibernate jpa
1个回答
0
投票

“表中的列”和“整个对象”之间没有概念上的区别:“整个对象”也是表中的列!

如果你看看实际的数据库模式,我们有类似的东西

+-------------+       +-------------+
|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 日志记录轻松检查您的查询正在被转换成什么。

© www.soinside.com 2019 - 2024. All rights reserved.