[英]Do service layer always must be transactional in spring?
我在春季有一個非常簡單的應用程序,包括1個用於db表的模型類,1個jpa存儲庫類1個服務和1個控制器類。
我的服務類別是:
@Transactional
@Service
public class SomeService {
private ServiceRepository serviceRepository;
@Autowired
public serviceService(ServiceRepository serviceRepository) {
this.serviceRepository = serviceRepository;
}
public void getServiceById(Long id) {
Model model = serviceRepository.getOne(id);
return....
}
}
它正在使用@Transactional批注。 但是如果我刪除那我得到
org.hibernate.LazyInitializationException:無法初始化代理
如果我不想要任何事務方法或類怎么辦,為什么我必須使其成為事務性的?
發生此異常是因為您嘗試訪問尚未在事務中加載的對象。
離開事務時,無法再從數據庫中加載對象。 但是交易不是強制性的。
我認為您有具有OneToMany / ManyToMany關系的對象,它們是lazyLoaded。 由於您的服務不是事務性的,因此與數據庫的連接已關閉,您無法再訪問對象。
您有2個選擇:
激活延遲加載(默認選項)時,應注意性能問題。 是否要使用它確實取決於您的業務邏輯,但是最好不要對數據庫具有多重訪問。
您也可以檢查Entity Graph以進行高級定制: https : //www.baeldung.com/jpa-entity-graph
此外,在開發時,請啟用休眠SQL跟蹤以查看后台發生的情況: https : //www.mkyong.com/hibernate/hibernate-display-generation-sql-to-console-show_sql-format_sql-and-use_sql_comments/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.