Hibernate
Spring
tags: Common
- 關鍵字: Spring, Hibernate, Proxy
Proxy object in hibernate
- Lazy Loading
- DAO 透過 Hibernate 回傳的物件為 Persistent Object 的 Proxy
- DAO: data access object 對映應用程式對持久層的呼叫
- Persistent Object: 當物件與資料庫中的資料有對應關係,並且與Session 實例有關聯而Session 實例尚未關閉(close)
- 解決辦法:lazy = false
- DAO 透過 Hibernate 回傳的物件為 Persistent Object 的 Proxy
- The Proxy doesn’t issue any SQL statement.
- 程式跟Proxy要資料
- 在 session 尚未 close 前,先將資料塞到 Proxy,當session close 後,view 依然可以使用 Proxy 中的資料
- 要不到時:LazyInitializationException
- annotation:直接在POJO上使用Annotation設定對映關係
- POJO:Plain Old Java Object,簡單java對象,沒有繼承任何類、也沒有實現任何介面,更沒有被其它框架侵入的java對象 (does not follow any of the major Java object models, conventions, or frameworks)
- package:javax.persistence
- 例如:
- @Entity
- @Table(name = “TEST”)
- @Id
- @Column(name = “id”)
Spring with Hibernate
- Hibernat + ORM
- Object/Relational Mapping
- mapping:hibernate.cfg.xml
- 利用sql生成資料庫
- 利用hibernate tool生成orm
- initialize class
- brick-platform.xml 設定要初始化的bean, class
- auto scan,找該package底下的所有annotation,並設定bean
<context:component-scan base-package="olitglobal"></context:component-scan>
- 聲明Bean
-
spring beans are all in singleton scope by default
-
以下4種Bean,本質上是相同的,只是為了區分不同功能
Annotation Meaning @Component generic stereotype for any Spring-managed component 其他元件 @Repository stereotype for persistence layer 持久層,ex:DAO @Service stereotype for service layer 服務層,業務邏輯 @Controller stereotype for presentation layer (spring-mvc) 控制層
-
- 注入Bean
- @Autowired
- Scope
- Singleton:default
- Prototype:每次都建立新的
- 交易屬性
- @Transactional
Spring Proxy and AOP
Transactional
- 設定檔 brick-platform.xml
<tx:annotation-driven transaction-manager="transactionManager" />
<context:component-scan base-package="olitglobal"></context:component-scan>
-
只有啟動時Proxy才會存在,當應用程式停止時,Proxy也跟著destroy
-
proxy class本身不包含transaction的程式碼,他將transaction handling給其他Spring framework的某些class
-
如果沒有介面可以實作,會直接用繼承的方式產生Proxy
-
動態代理
- JDK Reflection API:有實作interface
- cglib:沒有實作interface
-
Synchronizing resources with transactions
// 方法1 autowired
@Autowired
private OpticalCableService opticalCableService;
...
LOGGER.info(opticalCableService.getClass().getName());
// olitglobal.bp.optical.svc.OpticalCableService$EnhancerBySpringCGLIB$1784b26
// 方法2 applicationContext
private OpticalCableService opticalCableService =
SpringContext.getApplicationContext().getBean(OpticalCableService.class);
LOGGER.info(opticalCableService.getClass().getName());
// olitglobal.bp.optical.svc.OpticalCableService$EnhancerBySpringCGLIB$34da3c12
AOP
- 相較於OOP只能靜態的(Static)修改系統程式,AOP(Aspect-Oriented Programming,面向導向程式設計)不但允許軟體開發人員能做動態的修改,甚至不需修改原本靜態的Model
- OOP不適合定義橫向關係,例如日誌功能,日誌代碼往往橫向地散佈在所有對象層次中,而與它對應的對象的核心功能毫無關係
- 散佈在各處的無關的代碼被稱為橫切(cross cutting)
- 導致了大量代碼的重複,而不利於各個模塊的重用
- AOP:核心關注點和橫切關注點
- 核心關注點:業務處理
- 橫切關注點:權限認證、日誌
auto scan
- auto scan:透過Annotation告訴Spring框架,底下的代碼是代表什麼,來減少重複的例行性程式碼
- Inversion of Control - IOC:將控制權交到Spring的手上,讓Spring管理程式中的Bean,藉由控制關係的轉移,可以獲得元件的可重用性,應用程序組件的配置和Java對象的生命週期管理
- Dependency Injection - DI:為實現IOC的手段之一,讓Spring能夠自動創建所需的Bean,並注入到需要這些Bean的地方
- IOC
- constructor
- setter
- annotation 是 constructor, setter?
Reference
- Spring with Hibernate Transaction by Proxy
- https://xebia.com/blog/advanced-hibernate-proxy-pitfalls/
- https://www.topjavatutorial.com/frameworks/hibernate/hibernate-annotations/
- https://dotblogs.com.tw/una/2018/02/20/141448
- https://blog.csdn.net/KingCat666/article/details/76911704
- http://www.dotspace.idv.tw/Book/chap4.pdf
- https://spring.io/blog/2012/05/23/transactions-caching-and-aop-understanding-proxy-usage-in-spring
- https://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch08s06.html
- Spring 4.3.x 官方文件
- Spring 4.x 中文
沒有留言:
張貼留言