하이버네이트 MyBatis는 ORM이 아니다. 구 iBatis, 현재 MyBatis는 ORM(Object Relational Mapping이 아니다. http://en.wikipedia.org/wiki/Object-relational_mapping http://www.mybatis.org/ 이 두개 링크만 봐도 알 수 있지만, MyBatis 홈페이지에도 ORM이라는 말은 전혀 나오지 않는다. 그런데도 일부 MyBatis와 JPA 류를 같은 ORM이 아닌가 혼동하는 분들이 있다. ORM은 간단하게 말해서 Object와 Relataion
Batch patching [하이버네이트 N+1 Select] Batch Patching으로 해결하기 간단하다. Member -> C 연관 관계 위에다가 @BatchSize라는 애노테이션을 붙여주면 된다. 애노테이션의 값으로는 해당 컬렉션 몇 개를 동시에 읽어올지 설정하면 된다. [java] … @OneToMany(mappedBy = "owner") @BatchSize(size=30) private Set<Item> items; … [/java] 이렇게 설정해 두면 Member를 순회하면서 Item 컬렉션에 접근할 때 개별적으로
fetching strategies [하이버네이트 성능 튜닝] 패칭 전략 참조: http://www.javadev.org/files/Hibernate%20Performance%20Tuning.pdf 하이버네이트에서 패칭 전략은 애플리케이션에서 어떤 객체와 연관된 객체를 가져오는 방법이다. 즉 A->B 또는 A->Collection 이런 관계가 있을 때 A와 연관되어 있는 B 또는 Collection를 가져오는 방법이다. 쉽게 생각해보면 A를 가져갈때 B나 C도 같이 가져가는 방법이 있고,
하이버네이트 [하이버네이트 VS JPA] 객체 다루기 JPA를 언젠간 써야 할텐데 아직도 하이버네이트가 그냥 편해서… @_@;; 암튼 이 둘은 객체를 다루는 API가조금 다른데 그걸 정리해둡니다. 하이버네이트(Session) JPA(EntityManager) 설명 save() persist() 저장(정확하게는 Pesistent 상태로 변경) get() find() DB에서 가져오기 load() getReference() 프록시 가져오기 delete(
Clear [하이버네이트 배치 추가] flush와 clear 배치 작업이라는 것이 DB에서 데이터를 읽어온 다음 뭔가 수정하고 뭔가를 다시 DB에 넣는 작업인데 이런 작업을 하이버네이트로 할 때 조심해야 할 것이 있습니다. InvDailyClosing invDailyClosing = new InvDailyClosing(); invDailyClosing.setDate(today);
@BatchSize [하이버네이트] @BatchSize로 쿼리 갯수 대폭 줄이기 참조: – http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html – http://docs.jboss.org/hibernate/stable/annotations/api/org/hibernate/annotations/BatchSize.html 스터디의 회원은 각각 Collection<Study, Integer> 타입의 목록을 가지고 있습니다. 스터디당 참여율이나 신뢰도가 들어있는 콜렉션입니다. 그리고 스터디를 보여줄 때
메이븐 플러그인 [메이븐] 하이버네이트 플러그인 참조: http://kwon37xi.springnote.com/pages/2275410 http://mojo.codehaus.org/maven-hibernate3/hibernate3-maven-plugin/componentproperties.html 1. 메이븐 pom.xml 에 플러그인 추가하기 <plugin>
하이버네이트 [하이버네이트] 컬럼 타입은 어떻게 명시하는게 좋을까? @Column(columnDefinition=”TEXT”) private String descr; 이런 방법이 있습니다. 별로 좋은 방법은 아닙니다. postgresql에서는 괜찮지만, HSQL에서는 저 TEXT라는 SQL 타입이 못해서 해당 테이블을 만들지 못할겁니다. columnDefinition 이 속성 자체가 컬럼 만들 때 사용할 SQL을 입력하는 부분이기 때문에, 각기 다른
봄싹 [봄싹 버그]] JSON 뷰와 하이버가 가져온 Proxy 객체 JSON뷰랑 하이버 Proxy 객체가 만나면 JSON 뷰를 만들다 에러가 납니다. 하이버 객체가 Lazy 로딩을 할 수 없는 지점에서 Proxy 객체를 통해 collection에 접근해서 JSON 뷰로 만들 수 없는 데이터에 접근하여 발생하는 에러로 추측하고 있습니다. 에러가 좀 깔끔하게 떨어지면 해결책이나 원인을 찾기도 쉬울텐데.. 이건 뭐.. StackOverFlow 입니다. Q&A 게시판이
AridPOJOs [작명 고민] 하이버네이트 get/find류 작명 규약 1 참조: http://blog.xebia.com/2009/04/03/jpa-implementation-patterns-retrieving-entities/ 아시다시피, 하이버네이트에서 영속화 중인 객체를 가져오는 방법은 get()과 load()가 있습니다. 둘 다 가져올 객체 클래스와 id 값을 넘겨주면 원하는 객체를 가져올 수 있습니다. 일단 중요한 차이점 하나는 가져다 달라고 하는 객체가 없을 때 get()은 null을 반환하고 load()는
2차 캐시 [하이버네이트] 2차 캐싱 적용하기 참조 Java Persistence With Hibernate http://whiteship.tistory.com/1256 Improving Hibernate’s Performance 19.2. The Second Level Cache Hibernate: Truly Understanding the Second-Level and Query Caches Hibernate Caching 이론적으로 정리할 것 들 – 2차 캐싱이라고 하는 이유? 1차 캐시(persistence context cache)는 있으니깐. – 하이버네이트 캐싱
객체 상태 [하이버네이트] 애매한 에러 메시지 때문에 삽질.. @_@ DEBUG – OpenSessionInViewFilter.doFilterInternal(207) | Closing single Hibernate Session in OpenSessionInViewFilter DEBUG – SessionFactoryUtils.closeSession(784) | Closing Hibernate Session 2009. 8. 7 오후 9:30:52 org.apache.catalina.core.StandardWrapperValve invoke 심각: Servlet.service() for servlet springsprout threw exception org.hibernate.LazyInitializationException: failed to lazily initialize a collection of
@ManyToOne [하이버네이트] OneToMany에 FetchType.EAGER 사용시 어떤 일이 생길까? Plan -> PlanDetail 관계에서 Plan 쪽에서 PlanDetail로 OneToMany 관계를 설정하고, fetch 모드를 EAGER로 설정하면,, 엄청난 문제가 생길 수 있습니다. @_@ P 1 <– PD 1 P 1 <– PD 2 P 2 <– PD 3 P 3 이렇게 PD 두 개가 같은 P에 속해있을 경우, P 목록을
버저닝 [하이버네이트]롹킹과 성능 사이에 서다. 하이버네이트에 Optimistic 롹킹을 지원해주는 기능으로 버저닝이 라는게 있습니다. version 필드를 하나 만들어 주면 해당 엔티티에 변화가 일어날 때 마다 version 값을 증가시키는데, flush 하기 직전에 해당 객체의 version이 DB에 있는 version 값과 같은지 확인하는 작업입니다. 버전이 같지 않으면 StaleObjectStateException을 던져줍니다. 하이버네이트의 특징 중 하나로 연관 객체의 id만 알고 있다면, 굳이
enum 하이버네이트, 스프링 MVC에서 enum 사용하기 3 1. Character 값을 DB에 저장하는 enum도 지원하도록 구현했고.. 2. UserType 생성을 좀 더 간편화 했습니다. public enum FamillyCate implements PersistentEnum { FATHER(‘f’, “부”), MOTHER(‘m’, “모”), BROTHER(‘b’, “형제”), SISTER(‘s’, “자매&
enum 하이버네이트, 스프링 MVC에서 enum 사용하기 2 어제에 이어 오늘도 물고 늘어진다. 이번에 해결한 문제는, DB에 저장할 값을 int 타입 뿐만이 아니라 String 타입을 사용해도 무방하도록 코드를 수정했다. public enum UserCate implements PersistentEnum { ADMIN(“admina”, “관리자”), STAFF(“staff”, “직원”), SUPP(“supp”
enum 하이버네이트, 스프링 MVC에서 enum 사용하기 하이버네이트와 스프링 풀셋으로 구성되어 있는 웹 애플리케이션에서 자바 enum을 사용할 때 생기는 이슈가 뭘까? 1. DB에 어떤 값을 넣을 것이고, 2. 화면에는 어떤 값을 보여주고 어떻게 바인딩 할 것인가? 이 두 가지라고 한다. 그 밖에 이슈 될만한 것은.. 흠.. 뭐.. 없지 않을까 싶다. 왜 이슈일까? 1번 문제를 보자. DB에 잘
하이버네이트 결국 그냥 만들어버린 JPA 문서 자동화 툴 지난 번에 살펴본 hbm2doc로는 사부님이 원하는 문서를 만들기가 버거워서, 예전에 물개선생님이 만드셨다는 코드를 참조해서 비슷하게 만들었습니다. @Entity @Table(name = “users”, uniqueConstraints = @UniqueConstraint(columnNames = { “loginid” })) @SequenceGenerator(name=”user_sq”, sequenceName=”user_sq”) public class User { @Id @GeneratedValue(
하이버네이트 [하이버네이트] Session-Per-XXX 참조: JPWH 11장 Session-Per-Operation: 479p. 안티 패턴, 하나의 오펴레이션(메서드) 당 새로운 세션을 만들어 사용하는 것. 성능상 병목지점이 될 수 있다. Session-Per-Request: 479p. pesistence context 범위를 데이터베이스 트랜재션 범위와 동일하게 유지하는 것. 즉 트랜잭션 당 새로운 세션을 만들어 사용하는 것으로 볼 수 있다. 짧은 conversation(하나의 request-response 쌍)을 처리할
Detached 상태 [하이버네이트] detached 객체의 동일성 참조: JPWH 9.2.2 ~ 9.2.3 두 가지 동일성이 있다. 자바 객체 동일성과 DB 동일성이 있다. 자바 동일성은 == 으로 비교를 하고, DB 동일성은 주키 값을 비교한다. 자바 동일성과 DB 동일성이 모두 같을 조건을 Scope of object identity 라고 한다. 그 중에 세 가지 조건은 다음과 같다. – No
flush [하이버네이트 퀴즈] Flush @Transactional @Test public void crud() throws Exception { Emp emp = new Emp(); emp.setName(“ks”); ed.save(emp);
스프링 스프링 2.5 환경에서 하이버네이트 사용하기 참조 요약: Spring One 2008 Wokring With Hibernate in a Spring 2.5 Environment 스프링의 HibernateTemplate(Hibernate 3.1 이전) – 스프링이 관리하는 트랜잭션을 사용한다.– 예외 번역 제공 public class HibernateClinic extends HibernateDaoSupport {…} Native Hibernate DAO(Hibernate 3.1+_ – 트랜잭션 훅(hook)을 제공한다.– transactional session을
스프링 하이버네이트, 스프링, 트랜잭션, OSIV(Open Session In View) 패턴 참조 No Hibernate Session bound to thread 에러로 시작한 OSIV 얘기 http://forum.springframework.org/archive/index.php/t-33082.html 논쟁에서 언급한 HibernateTemplate API http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/orm/hibernate3/HibernateTemplate.html 스프링의 OpenSessionInViewFilter API http://static.springframework.org/spring/docs/2.
Criteria 하이버네이트 Criteria 검색 쿼리 골치 select this_.id as y0_ from Post this_ where this_.board_id=? select this_.id as id1_0_, this_.author as author1_0_, this_.board_id as board7_1_0_, this_.contents as contents1_0_, this_.created as created1_0_, this_.title as title1_0_, this_.updated as updated1_0_
스프링 @Repository를 쓴다면 하이버네이트 예외 변환기 직접 만들 필요 없습니다. 스프링이 2.0부터 제공하고 있었는데, 이제서야 알게 됐습니다. 저는 그동안 뭘…;;;; 한 거죠.. ㅋㅋㅋ 이 것 참..;; 혹시 저만 빼고 다들 알고 계셨던건 아니겠죠? 저는 게다가 항상 @Repository 애노테이션을 쓰고 있었거든요. 그런데도 몰랐습니다. @Repository 애노테이션 API에도 안 나와있네요. 하이버네이트 예외 변환기가 언제 필요하냐면.1. 하이버네이트 DAO 구현을 스프링 API에서