簡體   English   中英

服務層在春季總是必須是事務性的嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM