Tagged

hibernate

A collection of 27 posts

hibernate

하이버네이트 VS iBatis 성능 비교: 이번에는 select

결과는 비슷하다. 차이 없다. 어제는 insert 성능 비교했었는데, 단일 insert 문이야 얼마나 차이가 나겠냐. 고작 3~4 밀리세컨 가지고 성능을 논하기는 뭐할 것 같아서, 1000건~5000건을 한꺼번에 insert 시키는 시간을 측정해 봤더니, 이건 뭐 하이버네이트가 한 5~6배는 빠르게 나왔었다. 코드까지 열어봐도 잘 모르겠지만, 배치 업데이트를 하는것처럼 보인다. 그러지 않고서는

hibernate

OSIV 패턴 사용시 SQL 누수 현상에 대한 대처 방안

OSIV 패턴을 안티 패턴으로 보는 시각도 있다. 이해한다. OSIV 필터나 인터셉터를 사용하면 개발할 때 편하지만, 뷰 랜더링 시점에 예측하지 못한 쿼리가 발생해서 시스템 성능에 영향을 줄 수 있다. 그래서 확인해봐야 하는데.. 문제는 테스트할 때 OSIV 필터 적용으로 발생하는 추가적인 SQL까지 잡아낼 수 있느냐가 관건이다. 결론부터 말하자면, 그렇게 새어나가는 SQL을 모두

fetching strategies

[하이버네이트 성능 튜닝] 패칭 전략

참조: http://www.javadev.org/files/Hibernate%20Performance%20Tuning.pdf 하이버네이트에서 패칭 전략은 애플리케이션에서 어떤 객체와 연관된 객체를 가져오는 방법이다. 즉 A->B 또는 A->Collection 이런 관계가 있을 때 A와 연관되어 있는 B 또는 Collection를 가져오는 방법이다. 쉽게 생각해보면 A를 가져갈때 B나 C도 같이 가져가는 방법이 있고,

API 설계

Principle of least astonishment

참조: http://en.wikipedia.org/wiki/Principle_of_least_astonishment astonishment라는 생소한 단어 때문에 뜻을 가늠하기가 어렵습니다. astonishment는 경악, 놀람이라는 뜻으로, “최대한 놀래키지 말라는 원칙”입니다.  위키피디아의 정의를 인용하면 다음과 같습니다. In user interface design, programming language design, and ergonomics, the principle (or rule or law) of least

hibernate

OSGi에서 SessionFactory(Hibenate) 사용하기

참조 : http://www.osgi.org/blog/2007/06/osgi-and-hibernate.htmlhttp://notehive.com/wp/2008/07/23/osgi-hibernate-spring-dm-sample/ 번들 세 개만 살펴보겠습니다. 1. hibernate-class2. hibernate-session3. model-a1. hibernate-class 이 녀석은 하이버네이트 라이브러리를 묶어놓은 번들입니다. 얘가 담고 있는 라이브러리는 다음과 같습니다.이렇게 묶어놓은거 말고 스프링 번들 저장소에서 다운로드해서 일일히 설치해도 되야 할 것

HANS

OSGi에서 Hibernate의 SessionFactory 문제

대체 어떻게 해야 할까? 뭘? @Entity 달려있는 클래스들이 여러 번들들에 분포되어 있고, 애플리케이션이 돌아가는 도중에 번들이 추가되고, 없어지고, 다시 설치되고, 업데이트 되는 와중에 SessionFactory는 그에 따라 계속 바껴야합니다. Spring이 제공하는 AnnotationSessionFactoryBean 클래스로 만드는 SessionFactory는 정적입니다. 한 번 만들고 다른 빈들이 주입받아서 사용하는데, 도통 어떻게 변경해야 할지 모르겠습니다. 이게 문제는 OSGi,

hibernate

Table per connrete class with implicit polymorphism

특징 모든 구현 클래스 하나 당 하나의 테이블로 표현한다. 상속 받은 속성들도 테이블의 컬럼으로 맵핑한다. 문제점 다형적인 관계를 잘 지원하지 못해. 왜? 상위 클래스와 관계를 맺고 있는 클래스가 하위 클래스를 참조해야 한다면, 이 클래스가 가져야 할 하위 클래스의 외례키는 두 개의 하위 클래스 모두의 주키를 대변해야 할 텐데, 이런게 테이블에서는

hibernate

잘못 된 openSession() 사용 예제ㅋ

이전 글에서 DAO 구현을 다음과 같이 했었습니다. public class MemberDaoImpleWIthSpringTransaction implements MemberDao{     private SessionFactory sessionFactory;     public void setSessionFactory(SessionFactory sessionFactory) {        this.sessionFactory = sessionFactory;    }     public void add(Member member) {        Session session = sessionFactory.getCurrentSession();   

hibernate

12.2.8. Transaction management strategies

TransactionTemplate 나 TransactionInterceptor 를 사용하든 둘 다 PlatformTransactionManager 객체를 사용하고 있습니다. Hibernate를 위해 사용할 수 있는 TransactionManager로는 두 개가 있습니다. 1. HibernateTransactionManager :: for a single Hibernate SessionFactory, using a ThreadLocal  Session under the hood2. JtaTransactionManager :: delegating to the JTA subsystem of the container물론 직접 PlatformTransactionManager 인터페이스를 구현해서 사용해도 됩니다.

hibernate

12.2.7. Declarative transaction demarcation

이번엔 선언적인 트랜잭션 경계 설정에 관해 살펴보겠습니다. Spring AOP를 사용하는 방법으로 이전에는 Service Layer에 트랜잭션과 관련된 코드가 들어있었다면 Service Layer이 오직 자신의 본연의 임무에만 충실할 수 있도록 코드가 다음과 같이 바뛰게 됩니다. public class ProductServiceImpl implements ProductService { private ProductDao productDao; public void setProductDao(ProductDao productDao) { this.productDao = productDao; } // notice the

hibernate

12.2.6. Programmatic transaction demarcation

프로그래밍적인 방법으로 트랜잭션 경계를 지정하는 방법은 다음과 같이 비즈니스 로직 부분에 PlatformTransactionManager 를 인스턴스로 등록하고 Setter Injection을 사용하는 것입니다. <beans> <bean id="myTxManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="mySessionFactory"/> </bean> <bean id="myProductService" class="product.ProductServiceImpl"

hibernate

12.2.5. Implementing DAOs based on plain Hibernate3 API

Hibernate 3.0.1 에서는 “Contexture Sessions”라고 부르는, 트랜잭션 당 하나의 current 세션을 사용하는 방법이 있습니다. public class ProductDaoImpl implements ProductDao { private SessionFactory sessionFactory; public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } public Collection loadProductsByCategory(String category) { return this.sessionFactory.getCurrentSession() .createQuery("from test.Product product where

hibernate

레퍼런스 12장에 오타

문제가 발생한 코드는 Spring Reference에 있던 소스 코드입니다. public class ProductDaoImpl extends HibernateDaoSupport implements ProductDao { public Collection loadProductsByCategory(String category) throws DataAccessException, MyException { Session session = getSession(getSessionFactory(), false); try { List result = session.find( "from test.Product product where product.category=?", category, Hibernate.STRING); if (result == null) { throw new MyException("invalid

hibernate

12.2.4. Implementing Spring-based DAOs without callbacks

콜백 메소드를 사용하지 않고 HibernateDaoSupport로 부터 Session을 구해서 다음과 같이 코딩할 수 있습니다. public class ProductDaoImpl extends HibernateDaoSupport implements ProductDao {     public Collection loadProductsByCategory(String category)            throws DataAccessException, MyException {         Session session = getSession(getSessionFactory(), false);        try

hibernate

12.2.1. Resource management

자원을 관리하는 코드가 보통 사방에 흩어져 있게 됩니다. 하지만 스프링에서는 이런 자원 관리간단하면서도 강력한 방법인 tamplate을 사용한 IoC를 이용해서 관리합니다. 자원을 관리하는 기능과 SQLException을 보다 구체적이고 un-checked Exception인 DataAccessException으로 래핑해줍니다. HibernateTemplate, HibernateInterceptor, HibernateTransactionManager 이런 클래스들을 제공하는 가장 주요한 목적1. 어플리케이션에서 Data Access와 Transaction 기술을 깔끔하게 레이어링2. 어플리케이션 객체들 간의 Loose

hibernate

JUnit 으로 Hibernate 테스트

지난번에는 PizzaApp 클래스에서 새로운 피자 객체를 만들고 save()를 사용해서 DB에 insert를 했었습니다. 이번에는 PizzaTest 클래스를 만들고 JUnit을 사용해 봅니다. save()를 사용해서 DB에 피자 한판을 넣어보고 들어갔는지 빼내어 보고 빼낸 것이 null이 아닌지 확인해 봅니다. 연습용이기 때문에 test가 별로 맘에 안드실 수도 있습니다. 저도 별로 테스트가 맘에 들지 않지만

모델 수정하기

1-6. 모델 클래스 수정하기

Pizza 클래스에 새로운 필드를 추가해 봅니다. toping이라는 멤버를 추가하고 역시 어노테이션을 사용하여 @Column으로 지정해 줍니다. 그리고 getter, setter를 만들어 준뒤 PizzaApp 클래스에 적당한 값들로 세팅해 주고 save를 해봅시다.[#M_ more.. | less.. | //Pizza.java … private String toping; … @Column    public String getToping() {        return toping;