Whiteship's Note


하이버네이트를 이용한 DAO 코드에서 int 타입의 리턴값과 SQLException은 무슨 의미가 있을까...

Hibernate/study : 2008. 9. 8. 11:12


JDBC로만 코딩을 해오신 분에게 하이버네이트를 사용하여 만들 DAO에 필요한 메소드들을 정의해서 커밋해달라고 부탁했습니다. 그리고 다음과 같은 코드를 받았습니다.

public int update(final Task task) throws SQLException {
..
}

public int delete(final Task task) throws SQLException {
...
}

객체와 레코드가 맵핑되어 있는데 그 수를 셀 필요가 있을까요?

이 코드는 하이버네이트가 그 동안 저에게 얼마나 많은 도움을 줬는지 알게 해주는 코드였습니다. 상대방과 위에서 정의한 리턴값의 용도와 의도를 물어보고, 하이버네이트의 update와 JDBC update 개념이 다르다는 것과 하이버네이트 최신 버전은 모두 RuntimeException을 던진다는 이야기를 해줬습니다. 자세한 내용은 생략하겠습니다. 이미 이전에 하이버네이트의 update에 대해 장문의 글을 쓴적도 있고, RuntimeException에 대해서는 말할 필요도 없을테니까요.

성실한 누군가를 교육한다는건 정말 재밌는 일입니다. 기회가 되면 스크린캐스팅을 해서 올리고 싶은데, 실제 나가는 진도에 비해 공백이 너무 커서 스크랜캐스팅 편집도 해야 되는데 도무지 그럴 짬은 안나네요 ㅋ
top

Write a comment.


하이버네이트의 update() 와 merge()

Hibernate/study : 2008. 4. 29. 18:37


찬욱군의 블로그를 보다가 merge()를 save(), update() 대용으로 사용하는 코드를 봤습니다. 스프링의 샘플 코드더군요. 해당 코드에 보면 주석으로 모라모라고 달려있는데 그걸 찬욱군이 블로그에 잘 풀어서 설명해두었습니다. (하지만 잘 이해가... @.@;;)

왜 그렇게 코딩을 해야 하는지 모르겠더군요.

1. save() 대용으로 사용한 경우.

해당 코드는 아래와 같습니다.

    public void storeOwner(Owner owner) {
        // Note: Hibernate3's merge operation does not reassociate the object
        // with the current Hibernate Session. Instead, it will always copy the
        // state over to a registered representation of the entity. In case of a
        // new entity, it will register a copy as well, but will not update the
        // id of the passed-in object. To still update the ids of the original
        // objects too, we need to register Spring's
        // IdTransferringMergeEventListener on our SessionFactory.
        sessionFactory.getCurrentSession().merge(owner);
    }

    public void storePet(Pet pet) {
        sessionFactory.getCurrentSession().merge(pet);
    }

    public void storeVisit(Visit visit) {
        sessionFactory.getCurrentSession().merge(visit);
    }
코드 출처 : spring 소스/samples/petclinic/src/.../HibernateClinic.java

희한합니다. 전부 저장하는 류의 메소드들인데 merge()를 쓰고 있네요. 이 녀석들을 사용한 코드를 보니 AddXXFrom 류의 클래스들에서 사용하고 있었습니다. 왜 그랬는지 잘 모르겠습니다. 저 메소드들에 넘겨준 객체의 상태를 Persistent로 바꾸기 싫었다고 생각할 수 밖에 없습니다.(merge()의 특성은 조금 뒤에 살펴보겠습니다.) 그런데도 위의 주석을 보면 id값만은 어떻게든 가지고 싶어서 IdTransferringMergeEventListener 이런 녀석을 사용할 수도 있다고 나와있습니다.

그럼 결론은..

this.clinic.storeOwner(owner);

이렇게 넘겨준 owner라는 객체의 상태는 그대로 Transient로 유지하고 Persistent로 바꾸지 않으면서도 id 값은 가지고 있도록.. 하고 싶을 때 저런 방법을 사용할 수 있습니다. 귀찮게 왜 그럴까요? 몰겠습니다. 그냥 save(owner) 하면 넘겨준 owner 객체가 Persistent 상태가 되면서 id도 가지게 될텐데 말이죠.

2. update() 대용으로 사용하는 경우

update()에 대한 간략한 설명을 해야겠네요. update()는 그냥 DB의 UPDATE 문이 아닙니다. reattach입니다. reattach가 뭐냐면 "다시 붙이기"입니다. detached 상태의 객체를 Persistence Context에 다시 붙이는 것(해당 객체는 Persistent 상태가 되겠죠.)을 뜻합니다. update(owner); 를 하게되면 owner 객체를 다시 Persistent Context에 붙이고 그럼 owner 객체는 Persistent 상태가 됩니다. 이 때 다음과 같은 문제가 발생할 수 있습니다.

        Member member2 = (Member) session2.get(Member.class, member.getId());
        session2.update(member);

두 줄 모두 하이버의 Unit of work 내에서 실행된다면, NonUniqueObjectException()이 발생합니다. 말 그대로 입니다. Persistent Context 내부에 단일 레코드를 나타내는 둘 이상의 객체가 존재하기 때문에 발생하는 것입니다. 이 현상이 나쁜건가요? 당연한 겁니다. 대체 하이버는 누굴 기준으로 더티 체킹을 해야하죠?? 이 예외를 피해가야 할까요? 아니죠. 소스 코드를 손봐야 하는 겁니다. 어떻게요? 순서를 바꿔주면 됩니다.

        session2.update(member);
        Member member2 = (Member) session2.get(Member.class, member.getId());

만약 왜 위에는 에러가 나고 아래는 에러가 안 나는지 모르시겠다면, 하이버네이트 공부를 하시면 됩니다. 간략하게 설명 드리면, member 객체가 먼저 Persistent Context에 들어가서 Persistent 상태가되고, 그 다음 get()을 하면 DB에서 읽어오는게 아니라 Persistent Context에서 가져오기 때문에 아무런 문제가 없습니다.

그런데 같은 문제를 merge()를 사용해서도 해결할 수 있습니다.

        Member member2 = (Member) session2.get(Member.class, member.getId());
        Member member3 = (Member) session2.merge(member);

이렇게 말이죠. 그런데 여기서 중요한 건 member2와 member3은 Persistent 객체이고 member와 같은 값을 가지고 있지만, member만 여전히 Detached 상태라는 것입니다. 그리고 member2와 member3에 대한 변경(dirty) 사항이 양쪽 모두에 적용이 됩니다. 얼마나 아리까리 합니까? 그래서 하이버 책에서는 merge()해서 돌려받은 객체(여기서는 member3)만 사용하라고 권장하고 있습니다. 그런데 객체가 막 돌아다닐텐데 권장사항대로 잘 되진 않겠죠.

merge()는 넘겨받은 객체의 값들과 콜렉션을 복사합니다. 그리고 그 객체가 가지고 있는 id와 같은 id를 갖고 있는 녀석을 Persistent Context에서 찾아서 가져옵니다.(SELECT 쿼리 안 날아감.) Persistent Context에 없으면 DB에서 가져옵니다.(SELECT 쿼리 날아감.) 그런 다음에 값들을 가져온 객체(Persistent 상태겠죠.)에다가 덮어씌웁니다. 그리고 그녀석을 반환해 줍니다. 따라서 Detached 상태로 넘겨준 객체는 여전히 Detached 상태로 남아있고 그 객체와 같은 값을 가진 새로운 Persistent 객체가 만들어지게 됩니다.

그런데 넘겨준 객체가 Detached 객체가 아니라 Transient 객체라면?? 즉 save() 대용으로 merge()를 사용하는 경우가 이 경우에 해당하겠죠. 그렇다면, id가 없고 그럼 Persistent Context에서 찾을 것도 없고 DB에서 가져올 것도 없습니다. 대신 하나를 새로 만들어야겠죠. 대신 이 녀석도 마찬가지로 넘겨받은 객체의 값들을 복사해서 새로운 객체를 만들고 나중에 Unit of Work가 끝난 뒤 INSERT 문이 날아갈 준비가 됩니다. 다시 한번 주의할 것은 넘겨 받은 객체 자체를 Persistent 상태로 만들지는 않는다는 것입니다. merge()는 넘겨받은 객체의 상태를 바꾸지 않습니다.

결론을 내리자면, save() 대용으로 merge()를 사용하는 건 제 생각으로는 비추입니다. 애초에 merge()는 Detached 객체를 reattach 하기위한 용도이지, Transient 객체를 위한 용도가 아닙니다. update()의 대용으로 사용하는 걸 생각해볼 수는 있지만, merge()와 update()의 특징에 따라 원하는 것을 사용하시는게 좋겠습니다. 단순하게 예외를 피하기 위한 용도로 사용하는 것은 비추입니다.

참조 : Java Persistence With Hibernate 9장
top

  1. Favicon of https://ecogeo.tistory.com BlogIcon 에코지오 2008.04.30 12:23 신고 PERM. MOD/DEL REPLY

    상세한 설명 감사드립니다.

    스프링 샘플 소스 보다가 '엥. 이거 뭐냐. 내가 모르는 또다른 비밀이 있나' 싶어서 최범균님 책을 다시 읽어봐도 이유를 잘 몰랐었는데, 기선님이 명쾌하게 상황정리(?)해 주셨네요.

    근데 스프링 샘플에서 저런 코드가 있으니 많은 개발자들이 c&p하면서 오용된 코드를 양산할 가능성이 있겠는걸요.

    "merge는 merge일뿐 오용하지 말자." ^^

    Favicon of http://whiteship.tistory.com BlogIcon 기선 2008.04.30 13:35 PERM MOD/DEL

    넹 잘 읽어주셔서 감사합니다. 상당히 글이 길어져서 누가 읽을까 싶었는데 쓴 보람이 있네요. :)

Write a comment.


하이버네이트를 쓰려면 게터 세터가 꼭 필요하다.

Hibernate/study : 2007. 12. 26. 14:58


뻥입니다. 보통 게터 세터를 많이 만들어서 사용하기때문에 이렇게 생각할 수도 있겠습니다. 하지만 미신입니다.

필드에 직접 접근할 수 있습니다.

코딩으로 검증작업은 찬욱군이 해주었습니다.

저는 구글링으로 검증을 해보았습니다.
바로 hibernate-mapping default-access="field" 이런 설정이 검색되었습니다. 하이버네이트 레퍼런스 5.1.2. hibernate-mapping 부분의 설정에 보면 위의 설정이 있습니다.

찬욱군 블로그의 Hibernate 기초 학습[6] - AccessType / fomula 이 글을 보시면 다양한 설정 방법을 참조하실 수 있습니다.
top

Write a comment.


잘못 된 openSession() 사용 예제ㅋ

Hibernate/study : 2007. 5. 4. 20:55


이전 글에서 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();
        session.save(member);
    }
}

여기서 빨간 색 부분은 찬욱군이 알려줬기 때문이고 원래는 아래처럼 코딩했었습니다.
    public void add(Member member) {
        Session session = sessionFactory.openSession(); //(1)
        session.save(member);
        session.flush(); //(2)
        session.close(); //(3)
    }

위에 표시한 빨간 부분이 모두 잘못된 부분이였습니다.

(1) 오픈 세션은 새로운 세션을 만들게 되고 그럼 새로운 트랜잭션에서 save를 실행하게 됩니다. 그런데 지금 저 코드는 새로운 트랜잭션이 아니라 Service Layer에서 사용하던 트랜잭션을 사용해야 합니다. 그러려면 새로운 세션이 아닌 getCurrentSession을 사용하면 기존에 존재하는 트랜잭션을 사용하게 됩니다.

(2) flush()는 무조건 DB에 저장하게 된다고 합니다. 따라서 삭제해야합니다. 지금 이 코드는 트랜잭션 내에 있고 예외가 발생하면 롤백해야 되니까 무조건 DB에 넣어버리는 flush()를 사용하면 안되겠습니다.

(3) getCurrentSession은 자기가 알아서 세션을 닫기 때문에 명시적으로 session을 닫아버리면 안됩니다.(에러가 나더군요.)

찬욱군 베리베리 땡큐 감사!!
top

Write a comment.


Convention over Configuration

Hibernate/study : 2007. 3. 2. 00:06


RoR을 공부해 본적은 없지만 조만간 운좋게 베타리더로 Rails for Java Developer를 접하게 될 것 같아서 공부하게 될 것 같습니다.

짧게나마 이해한 바로는 '설정보다 규약이 편하니까 규약으로 할 수 있는 건 규약으로 하자.'는 것 같습니다. 숙제3 에 있는 링크 중에 하나에 다음과 같은 그림이 있습니다.

사용자 삽입 이미지
장점 : 1. 새로운 개발자가 시스템을 빨리 이해할 수 있다. 2. 일관성을 높일 수 있다. 3. 보다 유연하다.

단점 : 1. 잘 알고 있어야 한다. 2. 프레임웤이 커진다. 3. 프레임웤이 새로운 규약을 도입했을 때 리팩토링이 힘들다.

단점 중에 3번이 가장 치면적인 것 같습니다. EJB였나.. 3.0으로 올리면서 어떤 속성의 default값을 바꿔서 온라인에서 개발자와 된통 싸웠다는 이야기를 들은 것 같은데 3번에 딱 맞는 예가 될 것 같습니다.[각주:1]

Spring에 CoC가 적용된 예로는 InternalResourceViewResolver, MethodNameResolver, ControllerClassNameHandlerMapping. 이런 것들이 있다고 합니다. 참조


  1. 자세한 내용은 찬욱이한테 들은 것 같긴한데 기억이 잘 안납니다. [본문으로]
top

Write a comment.


숙제 3

Hibernate/study : 2007. 3. 1. 23:43


Controller
- Spring reference :: Chapter 13
- Spring API :: Controller
- Spring MVC :: p52(71)
- Pro Spring :: p531
- 영회형 전 블로그 :: Spring MVC컨트롤러 탐험기[1] Controller와 ModelAndView

SimpleFormController
- Spring reference
- Spring API :: SimpleFormController
- Spring MVC :: p65(84)
- Pro Spring :: p547

PropertyEditor
- Spring Reference :: Chapter 5
- Java API :: PropertyEditor
- 영회형 블로그 :: Spring 기본 지원 Property type
- 영회형 전 블로그 :: Spring MVC 사용시 다수의 문자열을 List로 받기
- Whiteship 전 블로그 ::  Spring reference 5장 정리
- Spring MVC :: p124(143)
- Pro Spring :: p126

CoC
- Convention over Configuration 의 약어로 "설정을 능가하는 규약" 정도의 의미.
- http://softwareengineering.vazexqi.com/files/pattern.html
- Convention vs Configuration
- CoC in Spring MVC

top

  1. Favicon of http://humbleprogrammer.net/blog BlogIcon 정지웅 2007.03.04 00:35 PERM. MOD/DEL REPLY

    와~ 엄청난 분량이네요^^ 스터디 모임에서 하시는 숙제인지, 아니면 기선님 스스로 내시는 건지요? 공부하시고 숙제하시는 결과 공유해주셔서 많이 배워가고 있습니다^^ CoC에 대한 내용이 제일 궁금해지네요

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2007.03.04 11:14 신고 PERM MOD/DEL

    아.. 숙제는 물개 선생님께서 내주신 거구요. OpenSeed에서 하는 온라인 스터디를 진행하는데 필요한 사전 지식을 말씀해 주셔서 그부분에 대해 공부를 한 겁니다.

    CoC는 http://whiteship.tistory.com/512 여기에 매우 단순하게 요약해 뒀습니다.

  2. Favicon of http://humbleprogrammer.net/blog BlogIcon 정지웅 2007.03.04 20:22 PERM. MOD/DEL REPLY

    아 그렇군요^^ 좋은 내용 감사드립니다.

    Favicon of http://whiteship.tistory.com/ BlogIcon 기선 2007.03.04 22:58 PERM MOD/DEL

    에고 별거 아닌걸요 :);;

Write a comment.


The paradigm mismatch

Hibernate/study : 2007. 2. 16. 15:48


Hibernate를 공부하는 중인데요. 객체와 Relation간의 어떤 차이들이 있는 것인지 궁금해서 살짝 공부해 봤습니다.

The problem of graularity
=> 알갱의 크기가 달라서 생기는 문제

The problem of subtypes
=> 객체의 상속을 Relation에서 표현하기 위한 문제

The problem of identity
=> 객체와 그에 해당하는 row를 식별하는 문제

Problems relating to associations
=> 객체에서의 reference 연관과 Relation의 외례키를 사용한 연관의 차이

The problem of data navigation
=> DB의 성능을 높이기 위한 join과 persistence 객체의 fetching으로 인한 n+1 slelect 문제

'Hibernate > study' 카테고리의 다른 글

하이버네이트의 update() 와 merge()  (2) 2008.04.29
하이버네이트를 쓰려면 게터 세터가 꼭 필요하다.  (0) 2007.12.26
잘못 된 openSession() 사용 예제ㅋ  (0) 2007.05.04
Convention over Configuration  (0) 2007.03.02
숙제 3  (4) 2007.03.01
The paradigm mismatch  (0) 2007.02.16
The problem of data navigation  (0) 2007.02.16
Problems relating to associations  (0) 2007.02.16
The problem of identity  (0) 2007.02.16
The problem of subtypes  (0) 2007.02.14
The problem of graularity  (0) 2007.02.14
top

Write a comment.


The problem of data navigation

Hibernate/study : 2007. 2. 16. 15:04


참조 : Java Persistence With Hibernate

객체에서는 . 을 사용해서 다른 객체로 이동하곤 합니다. 하지만 SQL db에서 데이타를 이런식으로 가져오는 것은 효율적이지 않습니다.

db의 성능을 높이는 방법으로 SQL 쿼리 숫자를 줄이는 겁니다. 그래서 연관된 table 간의 join을 이용해서 data를 가져 옵니다.

만약에 Member에 있는 데이타만 관심이 있다면 Select * From member; 이렇게 하면 되겠지만 Member와 Messenger의 데이터에 모두 관심이 있다면 outter join을 이용해서 member를 가져와 두면 나중에 messenger의 데이터를 위해 쿼리를 날릴 필요가 없습니다.

하지만 Object persistence의 경우 객체에 처음 접근 할 때 fetching이라는 기능으로 연관된 객체를 붙여오는 기능을 제공하는데 이것은 각 노드 또는 콜렉션 마다 하나의 쿼리문을 실행하도록 요구하기 때문에 비효율적일 수 있습니다. 이것을 바로 무서운 n+1 selects problem 이라고 한다는 군요.

이 문제에 관해서는 13, 14, 15장에서 Hibernate가 제공해 주는 효율적이면서도 투명한 fetching 기능을 공부할 수 있을 것 같습니다.

'Hibernate > study' 카테고리의 다른 글

하이버네이트를 쓰려면 게터 세터가 꼭 필요하다.  (0) 2007.12.26
잘못 된 openSession() 사용 예제ㅋ  (0) 2007.05.04
Convention over Configuration  (0) 2007.03.02
숙제 3  (4) 2007.03.01
The paradigm mismatch  (0) 2007.02.16
The problem of data navigation  (0) 2007.02.16
Problems relating to associations  (0) 2007.02.16
The problem of identity  (0) 2007.02.16
The problem of subtypes  (0) 2007.02.14
The problem of graularity  (0) 2007.02.14
Custom Tag 만들기  (0) 2007.02.07
top

Write a comment.


Problems relating to associations

Hibernate/study : 2007. 2. 16. 13:17


참조 : Java Persistence With Hibernate

객체에서는 객체들의 관계를 reference를 사용해서 나타내지만 관계형 DB에서는 외례키로 나타내기 때문에[footnote]이밖에 데이타 무결성을 위해서도 사용된다.[/foonote] 발생하는 문제입니다.

방향성에 대한 차이
  • Object Reference는 고유의 방향성이 있다. 참조 하는 쪽과 참조 되는 쪽이 있다는 말인듯 합니다. 따라서 양방향성을 설정 하려면 두 번 설정해 줘야 합니다.
public class Member{
    private Set<Messenger> messengers;
}

public class Messenger{
    private Member member;
}
  • Foreign key를 사용한 관계는 정해진 방향성이 없다. 임의로 join이나 projection을 사용해서 연관을 맺을 수 있기 때문에 Navigation이 관계형 데이타 모델에 의미가 없다.

관계에 있어서 차이
  • Java에서는 다 : 다 관계를 표현할 수 있다. Java class를 보고 어떤 관계인지 알 수가 없다.
  • DB에서는 항상 1 : 다 또는 1 : 1 관계다. 외례키 정의한 부분을 보면 어떤 관계인지 알 수 있다.

'Hibernate > study' 카테고리의 다른 글

잘못 된 openSession() 사용 예제ㅋ  (0) 2007.05.04
Convention over Configuration  (0) 2007.03.02
숙제 3  (4) 2007.03.01
The paradigm mismatch  (0) 2007.02.16
The problem of data navigation  (0) 2007.02.16
Problems relating to associations  (0) 2007.02.16
The problem of identity  (0) 2007.02.16
The problem of subtypes  (0) 2007.02.14
The problem of graularity  (0) 2007.02.14
Custom Tag 만들기  (0) 2007.02.07
책을 샀습니다.  (0) 2007.02.04
top

Write a comment.


The problem of identity

Hibernate/study : 2007. 2. 16. 12:27


참조 : Java Persistence With Hibernate

Java에는 두 가지의 동일성에 대한 표현[각주:1]이 있고 DB에서의 row에 대한 identity는 주키로 나타내기 때문에 발생하는 문제 입니다.[각주:2]

9.2.2에 보시면 equals()와 hashCode()를 구현할 때 주의할 것들이 나옵니다.
  • equals()와 hashCode()를 테이블의 주키 값의 동일성으로 구현을 하면 transient 객체의 동일성 비교를 할 때 아직 id가 없는 상태이기 때문에 문제가 발생하며..
  • equlas()와 hashCode()를 테이블의 주키를 제외한 다른 모든 속성들의 값으로 구현을 하면 같은 row인데 속성하나가 바꼈다고 다른 row로 인식하거나.. 다른 row인데 값이 같다고 해서 같은 객체로 인식하는 문제가 발생합니다.
  • 그래서 business key를 사용하라는 내용이 있었습니다. 주키는 surrogate key를 사용하는데 둘다 유일한 값을 가지며 차이가 있다면 business key는 어떤 의미가 있는 값(ex. 학번, 주민번호)이 지만 surrogate key는 아무런 의미가 없이 DB에서 식별자 역할 만 한다는 겁니다.
주키를 정할 때 surrogate key로 정하는데 DB를에 row 식별을 위해 만든 속성을 domain model에 표현을 해야하는 건지..? 라는 질문을 던지고 있습니다. 여기에 대해서는 p162쪽 4.2.2에 보시면 Hibernate는 db identity를 application에서 두 가지 방법으로 표현할 수 있다고 합니다.
  • persistence 객체의 식별자 속성의 값으로
  • Session.getIdentifier(Object entity)의 리턴값으로
  1. Equality를 나타내는 equals()와 Object identity를 나타내는 == 이 있습니다. [본문으로]
  2. 단순히 동일성 표현 방법의 갯수가 차이 나서 그런 것은 아닙니다. [본문으로]

'Hibernate > study' 카테고리의 다른 글

Convention over Configuration  (0) 2007.03.02
숙제 3  (4) 2007.03.01
The paradigm mismatch  (0) 2007.02.16
The problem of data navigation  (0) 2007.02.16
Problems relating to associations  (0) 2007.02.16
The problem of identity  (0) 2007.02.16
The problem of subtypes  (0) 2007.02.14
The problem of graularity  (0) 2007.02.14
Custom Tag 만들기  (0) 2007.02.07
책을 샀습니다.  (0) 2007.02.04
DisplayTag1.1 예제 보기  (0) 2007.01.30
top

Write a comment.


The problem of subtypes

Hibernate/study : 2007. 2. 14. 20:58


참조 : Java Persistence with Hibernate

객체에서는 상속이라는 것이 있는데 DB에는 그런게 없기 때문에 발생하는 문제입니다.

객체는 클래스라는 타입이 있고 이러한 타입이 상속되는 반면에 DB에 있는 Table은 type이 아니기 때문에 supertable 이나 subtable 같은 단어는 없습니다. 5장 5.1 "Mapping class inheritance"(p192)에서 이 문제에 대한 해결 방법이 나와 있습니다.

사용자 삽입 이미지

만약에 위와 같은 상속 구조를 DB로 표현하는 방법으로 책에서는 네가지 방법(크게 세가지)을 소개하고 있습니다.

1. Table per concrete class(with implicit polymorphism)

사용자 삽입 이미지
상속의 특징 중에 상위 클래스의 속성을 물려 받는 특징은 살렸지만... 다형성은 이용하지 못하겠습니다. 또한 상위 클래스의 속성이 변하게 되면 이런 테이블들 또한 일일히 변하게 되어야 하기 때문에 난감할 수 있겠습니다.

다형성이 필요없고 상위 클래스의 변동이 거의 없는 경우에 사용할 수 있겠습니다.

2. Table per concrete class(with unions)

사용자 삽입 이미지
매핑을 1번과는 조금 다른 방법으로 하지만 테이블의 구조는 1번과 거의 같은 구조의 스키마를 보이게 됩니다. 상위 클래스에 있는 속성들을 중복해서 선언하지 않고 <union-subclass> 태그를 이용해서 매핑 시킬 수 있습니다. 이 때 테이블의 주키도 역시 공유가 되기 때문에 같게 됩니다. 그리고 다형성을 이용할 수 있습니다.

3. Table per class hierarachy

사용자 삽입 이미지
가장 단순하고 성능도 좋은 매핑 전략입니다. 아예 하나의 테이블 안에 넣어 뒀기 때문에 다형성을 사용할 수 있으며 표현하기도 간단합니다.

그런데 하위 클래스들의 속성들은 전부 nullable이어야 한다는 제약이 있습니다. 생각해보면 당연합니다. Employee에 대한 정보를 넣고 싶은데 PartTimeWorker에 대한 정보가 없다고 못 넣는 다는 건.. 좀.....그렇쵸. 그리고 WORKER_TYPE 과 같은 구분자가 필요한데요. 이건 객체에 표시하진 않고 DB에서만 사용됩니다.

그리고 주키 아닌 속성에 종속되는 컬럼 들이 있기 때문에 정규화를 만족시키지 못한다는 것 역시 단점입니다.

4. Table per subclass

사용자 삽입 이미지

상속을 외례키를 사용한 관계로로 표현하는 방법입니다. 3번의 정규화 문제가 해결 됐다는 것이 장점이고 다형성은 join을 사용해서 가능합니다. 구분자도 필요없게 되었습니다. 하지만 맵핑 설정하는 것이 조금 복잡하네요. ~.~ 그리고 복잡한 상속 구조에서의 성능이 굉장히 안좋은 것 같습니다.

이 들 여러 전략들 중에 어느것을 사용할 지는 그때 그때 다르겠지만 3번과 4번이 가장 자주 사용될 듯 한 기분입니다.

'Hibernate > study' 카테고리의 다른 글

숙제 3  (4) 2007.03.01
The paradigm mismatch  (0) 2007.02.16
The problem of data navigation  (0) 2007.02.16
Problems relating to associations  (0) 2007.02.16
The problem of identity  (0) 2007.02.16
The problem of subtypes  (0) 2007.02.14
The problem of graularity  (0) 2007.02.14
Custom Tag 만들기  (0) 2007.02.07
책을 샀습니다.  (0) 2007.02.04
DisplayTag1.1 예제 보기  (0) 2007.01.30
DisplayTag 써보기  (2) 2007.01.30
top

Write a comment.


The problem of graularity

Hibernate/study : 2007. 2. 14. 16:06


참조 : Java Persistence With Hibernate

객체는 덩어리의 사이즈가 다양하고 DB에는 덩어리라고 할 수 있는 것이 테이블과 레코드밖에 없기 때문에 생기는 불일치를 말합니다.

덩어리 사이즈에 대한 이해가 쉽지 않았습니다. 예전에 corse-grained와 fine-grained에 대해서 OpenSeed 온라인 강좌에 댓글로 질문을 올렸었는데요. 그 때 승택님께서 답변을 해주셨지만 사실..그땐 잘 이해를 못했었습니다. 지금 다시 보니까 이해가 되는 것 같습니다.

사용자 삽입 이미지

그림에 보이듯이 User는 알갱이가 크다고 합니다. 반면에 Address는 알갱이가 작다고 합니다. 좀 더 자세히 살펴 보자면 다음과 같이 그릴 수 있겠네요.

사용자 삽입 이미지

저기 있는 것들을 단순하게 객체의 속성은 필드로 클래스는 테이블로 매칭시키기에는..뭔가 안맞는 것 같은 느낌이 드는데요. 이걸 해결하는 방법은 p177쪽 부터 설명이 나옵니다.

component라는 것을 사용한다고 하는데요. DDD quickly에서 보았던 Value Object가 나옵니다. 즉 identity를 가질 필요가 없고 값으로써 존재가치가 있는 개체 같은데요. 위에서 Address나 name이 그런 경우에 해당하지 않을까 생각해 봅니다. Account는 고유한 객체를 식별할 필요가 있게 느껴져서요.

'Hibernate > study' 카테고리의 다른 글

The paradigm mismatch  (0) 2007.02.16
The problem of data navigation  (0) 2007.02.16
Problems relating to associations  (0) 2007.02.16
The problem of identity  (0) 2007.02.16
The problem of subtypes  (0) 2007.02.14
The problem of graularity  (0) 2007.02.14
Custom Tag 만들기  (0) 2007.02.07
책을 샀습니다.  (0) 2007.02.04
DisplayTag1.1 예제 보기  (0) 2007.01.30
DisplayTag 써보기  (2) 2007.01.30
Criteria에서 Join하기  (0) 2007.01.29
top

Write a comment.


Custom Tag 만들기

Hibernate/study : 2007. 2. 7. 09:52


참조 : http://www.javastudy.co.kr/docs/lec_javaweb/jsp/chapter5.pdf

1. Tag Handler Class 만들기(TagSupport or BodyTagSupport 상속)
2. Tag Library Descriptor File 만들기(Tag 이름과 Tag를 정의한 클래스 등을 명시합니다.)
3. JSP에서 사용하기.(taglib 지시자에 url과 prefix 명시하기)

위 참조 문서에 나와있는 예제의 순서입니다.
1. Body와 속성이 없는 Tag
2. 속성이 있는 Tag
3. body가 있는 Tag
4. Optional Tag
5. Body 부분 조작하는 Tag
6. Body 부분 반복하는 Tag
7. 중첩 연관 Tag

개인적으로 1, 2, 3, 4 번 까지는 그런데로 이해가 되는 것 같은데 그 뒤로는 머리가 복잡해 지다가 7번에서 gg...

'Hibernate > study' 카테고리의 다른 글

The problem of data navigation  (0) 2007.02.16
Problems relating to associations  (0) 2007.02.16
The problem of identity  (0) 2007.02.16
The problem of subtypes  (0) 2007.02.14
The problem of graularity  (0) 2007.02.14
Custom Tag 만들기  (0) 2007.02.07
책을 샀습니다.  (0) 2007.02.04
DisplayTag1.1 예제 보기  (0) 2007.01.30
DisplayTag 써보기  (2) 2007.01.30
Criteria에서 Join하기  (0) 2007.01.29
숙제 2  (0) 2007.01.26
top

Write a comment.


책을 샀습니다.

Hibernate/study : 2007. 2. 4. 21:10


아마존에서 책을 사보긴 처음인데 제가 직접 사진 않았습니다. AJN(Agile Java Network)에서 '해외 서적 구매 대행'을 해줬기 때문에 완전 빠르고 싸게 구매할 수 있었습니다.

사용자 삽입 이미지
$59.99 짜린데 아마존에서 $39.59에 팔고 있습니다. 대강 4만원이 조금 안되는 돈으로 샀습니다. 그리고 배송이 불과 1주일 밖에 안걸렸다는거... 배송비가 대강 11달러 라고 했으니 만원이라고 하면 그래도 정가 보다 싸게 빨리 배송을 받은 겁니다. 영회형이 저 책을 2달 걸려서 받았다고 하니까 엄청나게 빨리 받은거죠.

그렇습니다. 여태까지 "책 산거 자랑하기"랑 "AJN 해외 서적 구매 대행" 광고였습니다.

'Hibernate > study' 카테고리의 다른 글

Problems relating to associations  (0) 2007.02.16
The problem of identity  (0) 2007.02.16
The problem of subtypes  (0) 2007.02.14
The problem of graularity  (0) 2007.02.14
Custom Tag 만들기  (0) 2007.02.07
책을 샀습니다.  (0) 2007.02.04
DisplayTag1.1 예제 보기  (0) 2007.01.30
DisplayTag 써보기  (2) 2007.01.30
Criteria에서 Join하기  (0) 2007.01.29
숙제 2  (0) 2007.01.26
HibernateTemplate  (0) 2007.01.26
top

Write a comment.


DisplayTag1.1 예제 보기

Hibernate/study : 2007. 1. 30. 22:40


1. 이 곳에서 displaytag1.1-bin 압축 파일을 다운로드 하고 압축을 풀면 아래에 있는 war파일이 보입니다.
2. 이클립스를 실행하고 패키지들이 있는 곳에서 빈곳을 오른쪽 마우스를 클릭해서 import를 클릭합니다.
사용자 삽입 이미지
3. import할 유형에서 war파일을 선택합니다.
사용자 삽입 이미지

4. 불러올 war파일의 경로를 찾아 줍니다.
사용자 삽입 이미지

5. Next를 클릭하면 아래와 같은 화면이 뜨는데요. 아무것도 선택하지 마시고 그냥 finish를 합니다.
사용자 삽입 이미지

6. 생성된 프로젝트를 우클릭 하시고 Run As -> Run on Server를 하면 예제들을 볼 수 있습니다.

'Hibernate > study' 카테고리의 다른 글

The problem of identity  (0) 2007.02.16
The problem of subtypes  (0) 2007.02.14
The problem of graularity  (0) 2007.02.14
Custom Tag 만들기  (0) 2007.02.07
책을 샀습니다.  (0) 2007.02.04
DisplayTag1.1 예제 보기  (0) 2007.01.30
DisplayTag 써보기  (2) 2007.01.30
Criteria에서 Join하기  (0) 2007.01.29
숙제 2  (0) 2007.01.26
HibernateTemplate  (0) 2007.01.26
HQL과 @Entity에 있는 name 속성의 관계  (0) 2007.01.24
top

Write a comment.


DisplayTag 써보기

Hibernate/study : 2007. 1. 30. 19:04


참조 :
http://displaytag.sourceforge.net/11/
http://blog.naver.com/jdkim528?Redirect=Log&logNo=140011759837

DispalyTag의 기능들을 사용해 보기 위한 기본 환경 세팅은 두번째 참조 링크에 있는 소스를 이용했습니다.

1. 기본적인 테이블 출력 <display:table name="members" />

<%
    request.setAttribute( "members", new MemberManager().getMembers(100) );
%>

<display:table name="members" />

사용자 삽입 이미지

2. 컬럼 이름을 명시적으로 주고 싶을 때는 <display:column property="멤버변수" title="Alias" />

<display:table name="members">
    <display:column property="name" title="이름" />
    <display:column property="email" title="이메일" />
</display:table>

사용자 삽입 이미지

3. 페이징 처리를 하고 싶을 때는 <display:table name="members" pagesize="10">

<display:table name="members" pagesize="10">
    <display:column property="name" title="이름" />
    <display:column property="email" title="이메일" />
</display:table>

사용자 삽입 이미지

4. 컬럼 별로 Soring이 가능하도록 설정 <display:column sortable="true">

<display:table name="members" pagesize="10">
    <display:column property="name" title="이름" sortable="true" />
    <display:column property="email" title="이메일" />
</display:table>

사용자 삽입 이미지

이밖에도 여러 기능을 할 수 있습니다.

'Hibernate > study' 카테고리의 다른 글

The problem of subtypes  (0) 2007.02.14
The problem of graularity  (0) 2007.02.14
Custom Tag 만들기  (0) 2007.02.07
책을 샀습니다.  (0) 2007.02.04
DisplayTag1.1 예제 보기  (0) 2007.01.30
DisplayTag 써보기  (2) 2007.01.30
Criteria에서 Join하기  (0) 2007.01.29
숙제 2  (0) 2007.01.26
HibernateTemplate  (0) 2007.01.26
HQL과 @Entity에 있는 name 속성의 관계  (0) 2007.01.24
Fluent Interface  (2) 2007.01.24
top

  1. Favicon of http://blog.naver.com/knbawe.do BlogIcon 짱가 2007.01.30 19:43 PERM. MOD/DEL REPLY

    항상 좋은 글, 자극 받고 있습니다. ^^

    짧지만 명료한 글들에 자극받고 갑니다.

    하나 하나의 포스팅에 든 시간 , 정리하는데 들어간 시간들,,,
    존경스럽기도 합니다. ^^

    그 선배에 그 후배라더니~~~~~ ^^

    Favicon of http://whiteship.tistory.com/ BlogIcon 기선 2007.01.30 20:38 PERM MOD/DEL

    감사합니다. :)

    윽..극찬을 해주셔서 어지럽습니다.ㅠ.ㅠ

Write a comment.


Criteria에서 Join하기

Hibernate/study : 2007. 1. 29. 20:11


참조 : http://www.hibernate.org/hib_docs/v3/api/org/hibernate/Criteria.html

Member(1) --- (*)Messenger 의 관계에서 다음과 같이 데이타가 들어있습니다.

Member m1 --- Messenger msg1("seal", MSN)
Member m1 --- Messenger msg2("seal2", Skype)
Member m3 --- Messenger msg3("keesun", MSN)

이 때 "MSN 메신저가 있는 모든 멤버"를 가져 오려면 join을 해야 합니다. Criteria를 사용해서 Join을 하는 방법은 두 가지가 있습니다.

1. createCriteria() 메소드 사용하기.

    public void testCriteriaJoin1(){
        insertDatas();
        final KMessengerType messengerType = KMessengerType.MSN;

        Criteria c = s.createCriteria(KMember.class)
                      .createCriteria("messengers")
                        .add(Restrictions.eq("m_type", messengerType));

        assertEquals(2, c.list().size());
    }

2. createAlias() 메소드 사용하기.

    public void testCriteriaJoin2(){
        insertDatas();
        final KMessengerType messengerType = KMessengerType.MSN;

        Criteria c = s.createCriteria(KMember.class)
                      .createAlias("messengers", "msg")
                      .add(Restrictions.eq("msg.m_type", messengerType));

        assertEquals(2, c.list().size());
    }

여기까지만 봐서는 둘의 차이가 단순히 alias를 사용해야만 한다는 것 밖에 모르겠습니다.[각주:1]

"MSN 메신저를 가지고 이름이 keesun인 멤버"를 찾으려면 위 주건에 .add(Restriction.eq("name", "keesun")만 추가하면 됩니다. 이것을 맨 끝에 추가 해보면 둘의 차이를 알 수 있습니다.

1. createCriteria() 메소드를 사용.

    public void testCriteriaJoin1(){
        insertDatas();
        final KMessengerType messengerType = KMessengerType.MSN;

        Criteria c = s.createCriteria(KMember.class)
                      .createCriteria("messengers")
                          .add(Restrictions.eq("m_type", messengerType))
                          .add(Restrictions.eq("name", "keesun"));

        assertEquals(1, c.list().size());
    }
=> Messenger에 name이라는 컬럼이 없다면서 HQE[각주:2]가 발생합니다.

2. createAlias() 메소드를 사용.
   
public void testCriteriaJoin2(){
        insertDatas();
        final KMessengerType messengerType = KMessengerType.MSN;

        Criteria c = s.createCriteria(KMember.class)
                      .createAlias("messengers", "msg")
                      .add(Restrictions.eq("msg.m_type", messengerType))
                      .add(Restrictions.eq("name", "keesun"));

        assertEquals(1, c.list().size());
    }
=> 제대로 동작합니다.

createCriteria(String) 메소드 뒤에 붙은 add() 메소드 들은 해당 String 타입에 대항하는 컬럼에 참조하게 되고 createAlias(String, String)메소드 뒤에 붙은 add() 메소드들은 여전히 기본(this)이 상위에 있는 createCriteria(Class)에 있는 Class 타입을 나타냅니다.

1을 제대로 동작하게 하려면 추가한 문장을 s.createCriteria(KMember.class) 요것 바로 다음으로 이동시키면 됩니다.

2에서 좀더 명확하게 나타내려면 .add(Restrictions.eq("this.name", "keesun")); 이렇게 this를 추가해 주면 됩니다.

  1. 'msg.'을 빼고 실행하면 Member에 m_type이란 컬럼이 없다면서  Hibernate.QueryException이 발생합니다. [본문으로]
  2. Hibernate Query Exception [본문으로]

'Hibernate > study' 카테고리의 다른 글

The problem of graularity  (0) 2007.02.14
Custom Tag 만들기  (0) 2007.02.07
책을 샀습니다.  (0) 2007.02.04
DisplayTag1.1 예제 보기  (0) 2007.01.30
DisplayTag 써보기  (2) 2007.01.30
Criteria에서 Join하기  (0) 2007.01.29
숙제 2  (0) 2007.01.26
HibernateTemplate  (0) 2007.01.26
HQL과 @Entity에 있는 name 속성의 관계  (0) 2007.01.24
Fluent Interface  (2) 2007.01.24
DbUnit  (2) 2007.01.23
top

Write a comment.


숙제 2

Hibernate/study : 2007. 1. 26. 21:15


1.  HTML 형태로 논의한 표준 화면 구성에 맞도록 전체 UI를 다시 재작성. (예외 케이스에 대처)

  • 화면의 유형
    • 메인 화면 : 타이틀 + 검색조건 + 버튼 + 그리드
    • 팝업 화면(입력/수정 화면) : 타이틀 + 입력폼 + 버튼
  • 검색 결과 화면에서 고려할 것
    • 검색 조건이 남아 있고, 북마크 했을 때 검색 결과 화면 보일 수 있도록 GET 방식의 Request 사용하기.
    • 검색의 결과 부분만 새로 고침 = 그리드 영역을 iframe으로 분리하기.
    • 기본 화면은 전체 데이터 뿌려주기.
    • 검색 조건이 늘어 날 수 있으므로 검색 버튼 추가.
  • 그리드에 필요한 기능
    • 컬럼 별로 정렬 기능
    • 페이징 처리
    • 체크 박스(다중 선택 가능)
    • 링크 달기
  • Messenger 정보 입력 방법
    • 한 화면에서 처리 하기 위해 입력할 수 있는 Messenger의 정보의 갯수를 세개로 제한.
  • Member - MemberGroup - Group 에서의 비즈니스 룰
    • 각 그룹의 등급은 세 가지. "대표 운영자", "운영 요원", "일반 회원"
    • Group을 만드는 사람이 "대표 운영자"가 됨. = Only one
    • Member는 Group에 기본으로 "일반 회원"으로 등록이 됨.
    • "대표 운영자"는 그룹에 있는 Member 들의 등급을 조정할 수 있슴.
    • "운영 요원"은 뭐하지??
    • 특정 그룹에 가입 or 탈퇴의 주체는 멤버쪽에서 결정 합니다.
    • 그렇다면 "너는 누구냐?"가 필요하네요. 로그인이 필요해짐. -> 멤버에 ID 는 email로 하고 비번은 새로운 필드가 필요함.

2. DisplayTag (김종대씨 사이트 참고)를 다운받아서 예제를 돌려볼 것.
http://displaytag.sourceforge.net/11/
http://blog.naver.com/jdkim528?Redirect=Log&logNo=140011759837

3. Spring2.0의 Form 태그 레퍼런스 메뉴얼 읽어볼 것.
http://static.springframework.org/spring/docs/2.0.x/reference/mvc.html#mvc-formtaglib

4. JSP 2.0에 추가된. TagFile 개발 사용법을 알아 둘 것.

5. 1~4에 너무 힘을 빼진 말고 Hibernate를 꾸준히 공부할 것.

'Hibernate > study' 카테고리의 다른 글

Custom Tag 만들기  (0) 2007.02.07
책을 샀습니다.  (0) 2007.02.04
DisplayTag1.1 예제 보기  (0) 2007.01.30
DisplayTag 써보기  (2) 2007.01.30
Criteria에서 Join하기  (0) 2007.01.29
숙제 2  (0) 2007.01.26
HibernateTemplate  (0) 2007.01.26
HQL과 @Entity에 있는 name 속성의 관계  (0) 2007.01.24
Fluent Interface  (2) 2007.01.24
DbUnit  (2) 2007.01.23
Hibernate에서 쿼리 날리는 방법  (0) 2007.01.19
top

Write a comment.


HibernateTemplate

Hibernate/study : 2007. 1. 26. 14:20


8.4. 기능구현 여기서 던졌던 의문에 실마리를 찾은 듯...

HibernateTemplate은 Spring에 있는 API로 Hibernate를 사용해서 데이타에 접근하는 것을 좀 더 편리하게 해주고 Checked Exception인 HibernateException을 Unchecked인 DataAccessException으로 바꿔 준다고 합니다.
    @SuppressWarnings("unchecked")
    public List<KMember> getMembers(final String name) {
        return getHibernateTemplate().executeFind(new HibernateCallback(){
            public Object doInHibernate(Session s) throws HibernateException, SQLException {
                Query q = s.createQuery("from k_Member m where m.name like :name order by m.name asc")
                           .setParameter("name", "%" + name +"%");
                return q.list();
            }
        });
    }

    @SuppressWarnings("unchecked")
    public List<KMember> getMembers(final String name) {
        Session s = getSession();
        Query q = s.createQuery("from k_Member m where m.name like :name order by m.name asc")
                      .setParameter("name", "%" + name +"%");
        return q.list();
    }

위나 아래나 같은 일을 하는 것 처럼 보이지만.. 아래는 Exception에 대한 고려도 없고 Session을 열고 닫아 주는 일을 수동으로 해줘야 하는 군요. HibernateTemplate API를 대강 읽어봤는데 역시 영어 실력이 OTL...

'Hibernate > study' 카테고리의 다른 글

책을 샀습니다.  (0) 2007.02.04
DisplayTag1.1 예제 보기  (0) 2007.01.30
DisplayTag 써보기  (2) 2007.01.30
Criteria에서 Join하기  (0) 2007.01.29
숙제 2  (0) 2007.01.26
HibernateTemplate  (0) 2007.01.26
HQL과 @Entity에 있는 name 속성의 관계  (0) 2007.01.24
Fluent Interface  (2) 2007.01.24
DbUnit  (2) 2007.01.23
Hibernate에서 쿼리 날리는 방법  (0) 2007.01.19
객체들의 상태 변화(in Hibernate)  (2) 2007.01.19
top

Write a comment.


HQL과 @Entity에 있는 name 속성의 관계

Hibernate/study : 2007. 1. 24. 17:14


ejb 3.0 spec 8장 제일 처음에 나오는 @Entity에 대한 설명을 찾아 보게 된 원인은 HQL을 작성하려다가 다음과 같은 형상이 벌어졌기 때문입니다.

@Entity
Member{}

이런 클래스가 있고 이 클래스에 대한 HQL을 작성할 때 다음과 같이 작성을 하면 에러가 발생합니다.

Session s;
s.createQuery("from member");

"" 안에는 HQL이라고 SQL과 비슷한 구문이 들어가지만 SQL은 테이블명과 컬럼명을 기준으로 작성하고 select가 있어야 하지만 HQL은 from만 필수 요소이고 클래스명과 멤버변수명으로 작성을 한다고 배웠습니다. 따라서 다음과 같이 작성해야 원하는 대로 작업이 수행됩니다.

s.createQuery("from Member");

문제는 @Entity의 속성중에 name 속성에 값을 줬을 때 발생합니다.

@Entity(name = "K_Member")
KMember{}

이런 클래스가 있을 때 클래스명을 사용해서 다음과 같이 HQL을 만들려고 해보지만
 
s.createQuery("from KMember");

KMember is not Mapped라는 에러 메시지를 볼 수 있습니다.

s.createQuery("from K_Member");

이렇게 @Entity의 name 속성에 지정한 이름으로 작성해야 원하는 결과를 얻을 수 있습니다.

결과적으로 HQL에서 쿼리를 작성할 때 @Entity 어노테이션의 name 속성에 들어가는 값을 사용해야 하며 대소문자를 구분합니다. @Entity의 name에 지정해 주는 값은 DB에서 테이블 명이 되기도 하지만 일치 하지는 않습니다. postgres에서 확인해본 결과 DB에 들어간 테이블 명은 k_member와 같이 전부 소문자로 바뀝니다. 따라서 클래스명이 바뀐다고 생각을 하는 편이 더 이해하기 쉬울 것 같습니다.

물개 선생님께서 알려 주셔서 테스트를 @Column의 name 속성을 주고 HQL을 작성할 때 name 속성에 넣은 값을로도 해봤습니다. 하지만 멤버변수들은 @Column의 name에 넣어준 값에 영향을 받지 않습니다. 멤버변수명으로 해야 HQL Query Exception이 발생하지 않습니다.

p157 에 간단하게 설명이 있습니다. @Entity의 name속성에 지정한 값은 쿼리에서 사용 되며 JPQL의 예약어 이면 안된다고 합니다.

'Hibernate > study' 카테고리의 다른 글

DisplayTag1.1 예제 보기  (0) 2007.01.30
DisplayTag 써보기  (2) 2007.01.30
Criteria에서 Join하기  (0) 2007.01.29
숙제 2  (0) 2007.01.26
HibernateTemplate  (0) 2007.01.26
HQL과 @Entity에 있는 name 속성의 관계  (0) 2007.01.24
Fluent Interface  (2) 2007.01.24
DbUnit  (2) 2007.01.23
Hibernate에서 쿼리 날리는 방법  (0) 2007.01.19
객체들의 상태 변화(in Hibernate)  (2) 2007.01.19
숙제  (0) 2007.01.19
top

TAG @Entity, HQL

Write a comment.


Fluent Interface

Hibernate/study : 2007. 1. 24. 00:14


참조 : http://www.martinfowler.com/bliki/FluentInterface.html
번역 : http://younghoe.info/1

오늘 OpenSeed 스터디를 통해서 알게 된 단어이자 어떻게 해석해야 할지 막막한 '흐르는 듯한 인터페이스'라고 하면 어울리려나..

code를 보시면 감이 팍 올 것 같습니다.

before
private void makeNormal(Customer customer) {
Order o1 = new Order();
customer.addOrder(o1);
OrderLine line1 = new OrderLine(6, Product.find("TAL"));
o1.addLine(line1);
OrderLine line2 = new OrderLine(5, Product.find("HPK"));
o1.addLine(line2);
OrderLine line3 = new OrderLine(3, Product.find("LGV"));
o1.addLine(line3);
line2.setSkippable(true);
o1.setRush(true);
}
after
   private void makeFluent(Customer customer) {
customer.newOrder()
.with(6, "TAL")
.with(5, "HPK").skippable()
.with(3, "LGV")
.priorityRush();
}

멋지지 않나요? DSL(Domain Specific Language)과도 관계가 있고 Value Object 이야기가 나오는걸 보니 DDD(Domain Driven Design)와도 관계가 있는 글 같습니다.

가독성 좋고, 코드 길이가 짧아져서 좋은 것 같습니다. 본문에 단점이라고 꼽은 것으로는 메소드 그 자체만 보면 의아해 할 수도 있다는 내용이 있었습니다. setter에 리턴타입이 표기 되기 때문에 그럴 수 있지요. 따라서 "연속되는 행위"에 활용이 되면 좋겠다는 내용이 있습니다.

Anyway 멋지네요.

'Hibernate > study' 카테고리의 다른 글

DisplayTag 써보기  (2) 2007.01.30
Criteria에서 Join하기  (0) 2007.01.29
숙제 2  (0) 2007.01.26
HibernateTemplate  (0) 2007.01.26
HQL과 @Entity에 있는 name 속성의 관계  (0) 2007.01.24
Fluent Interface  (2) 2007.01.24
DbUnit  (2) 2007.01.23
Hibernate에서 쿼리 날리는 방법  (0) 2007.01.19
객체들의 상태 변화(in Hibernate)  (2) 2007.01.19
숙제  (0) 2007.01.19
Transaction  (2) 2007.01.02
top

  1. Favicon of http://px.tistory.com BlogIcon 민재 2007.01.24 00:59 PERM. MOD/DEL REPLY

    fluent는 주로 "유창한"으로 번역이 되는거 같던데...
    코드가 정말 유창하게 의사표시를 하네.. ㅋㅋ..

    유창한 인터페이스.. 이것도 그리 나쁘지 않은 번역이 될듯...

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2007.01.24 01:07 신고 PERM MOD/DEL

    오호.. 유창한도 괜찮은데요? ㅎㅎ
    구어체 스러운 표현에 딱 어울리는 듯.

Write a comment.


DbUnit

Hibernate/study : 2007. 1. 23. 17:32


참조 : http://www.dbunit.org/index.html

Test 할 때 사용할 DB에 있는 값을 XML로 뽑아 내거나 XML에 입력한 데이타를 DB로 넣을 수 있는 오픈소스입니다. JUnit이랑 이름이 비슷한데 JUnit을 확장시킨 거라고 하네요.

사용하는 방법은 여기에 나와있지만 잘 모르겠습니다.
대강 본 바로는 xml에 각 테이블에 들어갈 데이타 들을 입력하고
FlatXmlDataSet 클래스를 이용해서 xml을 을 읽어들이고(ex. IDataSet)
읽어 들인 값을 집어 넣을 DB 커넥션을 설정(ex. IDatabaseConnection)해주면 DB에 들어가는 것 같습니다.
그리고 Assertion 이라는 클래스가 만들어져 있어서 ITable이나 IDataSet 끼리 assertEqulas 메소드를 사용해서 비교할 수 있습니다.

물개 선생님의 코드중 일부를 보시면 다음과 같습니다.  

public void testSampleData() throws Exception {

      insertFlatXmlDataSet("test/src/seal/sampleData.xml");

      assertEquals(3, memberDao.getAll().size());

      memberDao.getMembers("seal").get(0).getEmail());

      assertEquals(2, memberDao.getMembers("s").size());

}


맨 위에 첫줄로 xml에 입력 해 둔 데이타를 DB에 저장하고 그 뒤로는 DB에 들어간 값들을 가지고 테스트를 할 수 있습니다.

음~ 모든 필드들을 다 채워 넣은 다음에 다음과 같은 것들을 테스트 해보고 싶습니다.

  • Agile Java 그룹에 속한 멤버들 중에 이메일에 k가 들어가는 멤버 확인(Group->MemberGroup->Member)
  • keesun이라는 멤버가 속한 그룹의 이름 확인.(Member->MemberGroup->Group)
  • keesun이라는 멤버가 가진 이메일 주소 확인.(Member->Messenger)
  • Messenger 중에 MSN을 사용하지 않는 멤버들의 email.(Messenger->Member)

이렇게 해보면 연관관계가 제대로 되어 있는지 확인 할 수 있을 것 같습니다.

'Hibernate > study' 카테고리의 다른 글

Criteria에서 Join하기  (0) 2007.01.29
숙제 2  (0) 2007.01.26
HibernateTemplate  (0) 2007.01.26
HQL과 @Entity에 있는 name 속성의 관계  (0) 2007.01.24
Fluent Interface  (2) 2007.01.24
DbUnit  (2) 2007.01.23
Hibernate에서 쿼리 날리는 방법  (0) 2007.01.19
객체들의 상태 변화(in Hibernate)  (2) 2007.01.19
숙제  (0) 2007.01.19
Transaction  (2) 2007.01.02
JUnit 으로 Hibernate 테스트  (0) 2007.01.01
top

  1. Favicon of http://blog.naver.com/paradozz BlogIcon 오승택 2007.01.24 00:43 PERM. MOD/DEL REPLY

    대부분의 파서에서 내부적으로 Reflection과 Introspect 기법을 쓰는것 같습니다.
    아시겠지만서도 쿨럭.
    저런 문자하나하나를 긁어와서 동적으로 하나하나 실행하고 언로드 시키는 기법이라고 불리웁니다.
    하지만 DBUnit은 그냥 문자열에 대해 쿼리를 만드는점이 매력인것 같습니다.

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2007.01.24 01:06 신고 PERM MOD/DEL

    reflection은 쬐끔 봤었는데요. Introspect라는 단어는 처음 봐요.

    Digester도 그렇고 DBUnit도 그렇고 유용한 오픈소스들이 많다는 것을 새삼 느끼게 됐습니다. :)

Write a comment.


Hibernate에서 쿼리 날리는 방법

Hibernate/study : 2007. 1. 19. 16:47


참조 :
http://openframework.or.kr/JSPWiki/Wiki.jsp?page=Javacanhibernate7
http://www.hibernate.org/hib_docs/v3/api/org/hibernate/Session.html

1. HQL 사용하기.

 Query

createQuery(String queryString)
          Create a new instance of
Query for the given HQL query string.

 

2. Criteria API 사용하기.

 Criteria

createCriteria(Class persistentClass)
          Create a new
Criteria instance, for the given entity class, or a superclass of an entity class.

 Criteria

createCriteria(Class persistentClass, String alias)
          Create a new
Criteria instance, for the given entity class, or a superclass of an entity class, with the given alias.

 Criteria

createCriteria(String entityName)
          Create a new
Criteria instance, for the given entity name.

 Criteria

createCriteria(String entityName, String alias)
          Create a new
Criteria instance, for the given entity name, with the given alias.

 

3. 그냥 SQL 문 날리기.

 SQLQuery

createSQLQuery(String queryString)
          Create a new instance of
SQLQuery for the given SQL query string.

 

'Hibernate > study' 카테고리의 다른 글

숙제 2  (0) 2007.01.26
HibernateTemplate  (0) 2007.01.26
HQL과 @Entity에 있는 name 속성의 관계  (0) 2007.01.24
Fluent Interface  (2) 2007.01.24
DbUnit  (2) 2007.01.23
Hibernate에서 쿼리 날리는 방법  (0) 2007.01.19
객체들의 상태 변화(in Hibernate)  (2) 2007.01.19
숙제  (0) 2007.01.19
Transaction  (2) 2007.01.02
JUnit 으로 Hibernate 테스트  (0) 2007.01.01
Detached Objects  (0) 2007.01.01
top

Write a comment.


객체들의 상태 변화(in Hibernate)

Hibernate/study : 2007. 1. 19. 16:16


참조 : http://www.hibernate.org/hib_docs/v3/api/org/hibernate/Session.html

OpenSeed의 물개 선생님께서 지난 강의에서 Hibernate의 특징 중에 하나로 Transparent Persistency라는 용어를 설명해 주셨습니다. 어떤 객체가 자기 자신이 Persistent 객체임을 전혀 모르는 상태에서 Persistent와 관련된 일들이 벌어지기 때문에 "투명한 영속성"이라고 한다고 이해를 했습니다.

그렇다면 누가 어떤 객체를 Persistent와 관련된 일을 처리해 주는가? Persistent Manager가 그 일을 해 주는데 그러한 역할을 하는 대표적인 녀석으로 Session이 있다는 설명도 해주셨습니다.

Hibernate에서 사용하게 되는 객체는 Transient, Persistent, Detached 상태 중에 하나로 존재 하게 되는데 Session에 있는 메소드를 사용함에 따라 그 상태가 바뀌게 됩니다.

위 API에 있는 것을 그림으로 옮기면 다음과 같습니다.
사용자 삽입 이미지

merge()는 그리기가 불편해서 안그렸는데요. Tarsient나 Detached상태에서 merge()를 호출하면 '새로운 Persistent'가 된다고 합니다.

'새로운 Persistent'는 해당 객체가 주키는 가졌지만 아직 DB에는 들어가지 않은 상태를 말합니다.

지난 번에 각각의 객체들의 특징을 살짝 공부했던 적이 있네요.
Transient Object
Persistent Object
Detached Obejct

'Hibernate > study' 카테고리의 다른 글

HibernateTemplate  (0) 2007.01.26
HQL과 @Entity에 있는 name 속성의 관계  (0) 2007.01.24
Fluent Interface  (2) 2007.01.24
DbUnit  (2) 2007.01.23
Hibernate에서 쿼리 날리는 방법  (0) 2007.01.19
객체들의 상태 변화(in Hibernate)  (2) 2007.01.19
숙제  (0) 2007.01.19
Transaction  (2) 2007.01.02
JUnit 으로 Hibernate 테스트  (0) 2007.01.01
Detached Objects  (0) 2007.01.01
Object identity  (2) 2007.01.01
top

  1. Favicon of http://chanwook.tistory.com BlogIcon 찬욱 2007.01.19 18:27 신고 PERM. MOD/DEL REPLY

    Persistence Context이 Session이라고 생각하면 될 것 같습니다.
    Transparent Persistency를 HIA2에서는 transparent transaction-level wirte-behind 라고 하더군요. 어쨌든 transparent 라는게 중요한 것 같습니다.
    트랙백 달아 둡니다요~^0^

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2007.01.20 10:17 신고 PERM MOD/DEL

    헉.. transparent transaction-level wirte-behind 이건 너무 긴데? ㅋㅋ

Write a comment.


숙제

Hibernate/study : 2007. 1. 19. 00:36


1. GenericDao에서 사용한 Session의 메소드들 조사 & 객체의 상태 변화
- 객체들의 상태 변화
- Hibernate에서 쿼리 날리는 방법

2. DB에 test를 하려면 test를 위한 값이 있어야 하는데 이런 것들을 exel이나 xml에 데이타를 입력해서 test용으로 쓸 수 있도록 도와주는 오픈소스 조사 & 어떻게 사용할지 고민
- DbUnit

3. Yahoo의 YUI 조사.
- YUI

http://blog.1nooncorp.com/attach/0315/060315160206236729/283486.jpg

'Hibernate > study' 카테고리의 다른 글

HQL과 @Entity에 있는 name 속성의 관계  (0) 2007.01.24
Fluent Interface  (2) 2007.01.24
DbUnit  (2) 2007.01.23
Hibernate에서 쿼리 날리는 방법  (0) 2007.01.19
객체들의 상태 변화(in Hibernate)  (2) 2007.01.19
숙제  (0) 2007.01.19
Transaction  (2) 2007.01.02
JUnit 으로 Hibernate 테스트  (0) 2007.01.01
Detached Objects  (0) 2007.01.01
Object identity  (2) 2007.01.01
Persistent Object  (0) 2007.01.01
top

TAG 숙제

Write a comment.


Transaction

Hibernate/study : 2007. 1. 2. 17:41


사용자 삽입 이미지
[출처 : Hibernate In Action 5.1 Understanding database transactions]

트랜잭션의 특징(ACID)

■ Atomic : 트랜잭션은 하나 이상의 활동들을 묶어놓은 작업의 단위다. 원자성은 이 단위에 있는 모든 활동들이 전부 발생하거나 전부 발생하지 말아야 하는 것을 말한다. 만약 모든 활동들이 원활하게 진행되면 트랜잭션은 성공한다. 그러나 어떤 활동이라도 문제가 발생하면 롤백 하게 된다.

■ Consistent : 트랙잭션이 종료(잘 됐든 안됐든)되면, 시스템은 정상적으로 가동 되는 상태여야 한다. The data should not be corrupted with respect to reality.

■ Isolated : 트랜잭션은 여러명의 유저들이 각각 엉키지 않고 같은 데이타에 접근하는 것이 가능해야 한다. 따라서 트랜잭션은 각각에 독립적이어야 하며 같은 데이타에 동시에 읽거나 쓰는것을 방지해야 한다.(Note that isolation typically involves locking rows and/or tables in a database.) => row나 table별로 locking을 시도 한다고 한느데 이건 마치 자바에서 동기화 처리할 때 객체들의 key나 클래스의 key로 locking할 수 있는 것과 매칭이 됩니다.

■ Durable : 한번 트랜잭션이 완료되면 그 결과는 어떤 종류의 시스템 오류가 발생 하더라도 영구적으로 보존 되어야 한다. 보통 DB나 다른 종류의 Persistent 저장소에 저장하는 일을 포함한다.
[참고 : Spring In Action 5.1.1 Explaining transactions in only four words]

소스코드로 확인 하기

피자의 가격이 음수이면 UnderZeroException이 발생하도록 Pizza의 setPrice를 수정합니다.

public void setPrice(Integer price) throws UnderZeroException {
        if (price < 0) {
            throw new UnderZeroException();
        }
        this.price = price;
    }

그리고 PizzaApp 에서 setPice를 호출 하는 부분을 try-catch 블럭으로 묶습니다.[각주:1] 그리고 catch 블럭에서 tx.rollback()을 호출합니다.
try {
            Pizza pizza = new Pizza();
            pizza.setName("Delicious");
            pizza.setPrice(-100);
            pizza.setSize("Large");
            pizza.setToping("Shrimp & Stake");
            s.save(pizza);
            tx.commit();
        } catch (UnderZeroException e) {
            tx.rollback();
            e.printStackTrace();
        } finally {
            s.close();
        }

이제 위의 트랜잭션은 롤백되서 DB에 저장되지 않습니다.

  1. Alt + Shift + z -> y [본문으로]

'Hibernate > study' 카테고리의 다른 글

Fluent Interface  (2) 2007.01.24
DbUnit  (2) 2007.01.23
Hibernate에서 쿼리 날리는 방법  (0) 2007.01.19
객체들의 상태 변화(in Hibernate)  (2) 2007.01.19
숙제  (0) 2007.01.19
Transaction  (2) 2007.01.02
JUnit 으로 Hibernate 테스트  (0) 2007.01.01
Detached Objects  (0) 2007.01.01
Object identity  (2) 2007.01.01
Persistent Object  (0) 2007.01.01
Study To Do List  (2) 2006.12.29
top

  1. Favicon of https://na1217.tistory.com BlogIcon 샤우드 2007.01.02 17:44 신고 PERM. MOD/DEL REPLY

    커헉, 멋 모르고 들어왔다가 어디쓰는 용어야! 를 외치며 침몰됩니다...OTL
    (소스쪽은 언제봐도 이해가 안 되네요..ㅠㅠ)

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2007.01.02 17:55 신고 PERM MOD/DEL

    애니메이션 좋아하시는군요.
    DB와 관련될 때 자주 나오는 단어입니다.

Write a comment.


JUnit 으로 Hibernate 테스트

Hibernate/study : 2007. 1. 1. 19:30


지난번에는 PizzaApp 클래스에서 새로운 피자 객체를 만들고 save()를 사용해서 DB에 insert를 했었습니다.

이번에는 PizzaTest 클래스를 만들고 JUnit을 사용해 봅니다. save()를 사용해서 DB에 피자 한판을 넣어보고 들어갔는지 빼내어 보고 빼낸 것이 null이 아닌지 확인해 봅니다.

연습용이기 때문에 test가 별로 맘에 안드실 수도 있습니다. 저도 별로 테스트가 맘에 들지 않지만 DB에서 데이타를 꺼내오고 JUnit 형태로 만들어 보는것에 목적을 뒀습니다.

public class PizzaTest {

 

       private Session s;

 

       private Transaction tx;

 

       @Before

       public void createSession() {

             ApplicationContext ac = new ClassPathXmlApplicationContext(

                           new String[] { "applicationContext-dao.xml",

                                        "applicationContext-jdbc-datasource.xml" });

             SessionFactory sf = (SessionFactory) ac.getBean("sessionFactory");

 

             s = sf.openSession();

             tx = s.beginTransaction();

       }

 

       @Test

       public void createPizza() {

             Pizza p = new Pizza();

             p.setName("keesun's 2007 pizza");

             p.setPrice(2007);

             p.setToping("happiness");

             p.setSize("2007cm");

 

             s.save(p);

 

             List pizzaList =  s.createQuery("from O_Pizza").list();

             assertNotNull(pizzaList);

       }

 

       @After

       public void close() {

             tx.commit();

             s.close();

       }

}

오.. 잘 돌아갑니다. O_Pizza는 실제 table에는 o_pizza 이렇게 소문자로 들어가 있습니다. postgres 특징인것 같습니다. 하지만 프로그램에서도 o_pizza 이렇게 쓰면 다음과 같은 에러를 볼 수 있습니다.

DB의 table이름을 쓰지 말고 @Entity의 name속성에 지정한 이름으로 사용해야 합니다.


 

'Hibernate > study' 카테고리의 다른 글

DbUnit  (2) 2007.01.23
Hibernate에서 쿼리 날리는 방법  (0) 2007.01.19
객체들의 상태 변화(in Hibernate)  (2) 2007.01.19
숙제  (0) 2007.01.19
Transaction  (2) 2007.01.02
JUnit 으로 Hibernate 테스트  (0) 2007.01.01
Detached Objects  (0) 2007.01.01
Object identity  (2) 2007.01.01
Persistent Object  (0) 2007.01.01
Study To Do List  (2) 2006.12.29
Transient Object  (0) 2006.12.28
top

Write a comment.


Detached Objects

Hibernate/study : 2007. 1. 1. 18:51


참조 : Hibernate In Action 4.1.3 Detached Obejcts

트랜잭션이 완료되면 Persistence Manager과 연관이 있었던 객체는 그대로 남아있게 된다. 하이버네이트에서는 Session의 close()메소드를 호출하면 그 연관이 사라지며 이 상태는 DB과 동기화 되어 있지 않은 상태(동기화 된적이 있는 상태)로 Detached라고 한다.

하이버네이트에서 이 객체들은 새로운 persistent manager와 연관을 맺고 새로운 트랙잭션에서 재사용이 가능하다.=>다시 Persistent 객체가 될 수 있다.

DTO 패턴(안좋은 패턴 인듯..)을 피할 때 사용할 수 있다. <= 8장에서 살펴본다고 함.

evict()메소드를 호출하여 detached 상태가 될 수 있지만 cache 관리를 위해서 사용함으로 일반적인 방법은 아니다. Session의 close()를 사용하거나 원격으로 보내야 해서 직렬화 했을 때 모든 객체들이 detached된다.

사용자 삽입 이미지

'Hibernate > study' 카테고리의 다른 글

Hibernate에서 쿼리 날리는 방법  (0) 2007.01.19
객체들의 상태 변화(in Hibernate)  (2) 2007.01.19
숙제  (0) 2007.01.19
Transaction  (2) 2007.01.02
JUnit 으로 Hibernate 테스트  (0) 2007.01.01
Detached Objects  (0) 2007.01.01
Object identity  (2) 2007.01.01
Persistent Object  (0) 2007.01.01
Study To Do List  (2) 2006.12.29
Transient Object  (0) 2006.12.28
JPA를 필드 위에 써보기  (0) 2006.12.28
top

Write a comment.


Object identity

Hibernate/study : 2007. 1. 1. 17:44


참조 : Hibernate In Action 3.4. Understanding object identity

■ Object identity : == 으로 확인하며 객체가 메모리에 같은 위치에 있다.

■ Object equality : equals(Object o)로 확인하며 객체가 가지고 있는 속성들의 값이 같다. Object class의 equals(Obejct o)메소드는 Object identity를 확인하기 때문에 overriding하여 사용해야 한다. (String class는 값을 비교하도록 overriding 되어있습니다.)

Database identity : 관계형 DB에 저장되어 있는 객체들이 같은 테이블에 있고 주키 값이 같으면 같은 row이며 동등하다.


하이버네이트에서 DB에 있는 주키를 가져오는 방법으로 public 게터를 사용하고 주키의 값이 바뀌면 안되기 때문에 private 쎄터를 사용한다.

public class Category {
private Long id;
...
    public Long getId() {
    return this.id;
    }
    private void setId(Long id) {
    this.id = id;
      }
  ...
}

주키(primary key) 선택 조건 세가지
■ The value or values are never null.
■ Each row has a unique value or values.
■ The value or values of a particular row never change.

후보키(cadidate key) = 주키가 될 수 있는 식별자들.(유일 한 값들)

natural primary key = 주키에 비즈니스 의미가 포함되어 있는 키. 주민등록번호 중 두번째 단어의 첫 숫자는 성별을 나타낸다.(하리수의 경우 이 수가 변하는데 이때 주키의 조건 중 세번 째 것을 위반하게 됩니다.)

surrogate key(synthetic identifiers) = 아무 의미가 담겨져 있지 않은 주키. 이걸 쓰는 것을 강추하며 하이버네이트에 미리 만들어 놓은 다음과 같은 것들이 있다.
사용자 삽입 이미지
이중에서 예제에서는 sequence를 사용했었습니다.


'Hibernate > study' 카테고리의 다른 글

객체들의 상태 변화(in Hibernate)  (2) 2007.01.19
숙제  (0) 2007.01.19
Transaction  (2) 2007.01.02
JUnit 으로 Hibernate 테스트  (0) 2007.01.01
Detached Objects  (0) 2007.01.01
Object identity  (2) 2007.01.01
Persistent Object  (0) 2007.01.01
Study To Do List  (2) 2006.12.29
Transient Object  (0) 2006.12.28
JPA를 필드 위에 써보기  (0) 2006.12.28
@Column 조사  (2) 2006.12.28
top

  1. Favicon of http://chanwook.tistory.com BlogIcon 찬욱 2007.01.05 20:13 신고 PERM. MOD/DEL REPLY

    언제 트랙백을 달으셨데요~ 답글도 하나 달아주시지 ~ㅋ 몰랐네요.
    저도 한 방 쏩니다.

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2007.01.05 20:37 신고 PERM MOD/DEL

    ㅇㅇ아침에 달아놨지. 요즘 티스토리에서 테터로 트랙백이 안쏴져서 재미가 없던 참이라.. 틈나는대로 쏘고 있다. ㅋㅋ

Write a comment.


Persistent Object

Hibernate/study : 2007. 1. 1. 17:08


참조 : Hibernate In Action 4.1.2 Persistent Obejct

Persistent 객체는 Database indentity를 가지고 있는 객체이다.

Persistent Maneger(Hibernate의 Session)에 의해 save()가 호출된 객체 or 이미 Persistent Manager와 연관이 있는 Persistent 객체에 의해 참조된 객체. <= persistent instances are always associated with a Session and are transactional.

Persistent 객체는 트랜잭션이 끝날 때 까지 DB와 동기화된다. 트랜잭션이 커밋될 때 메모리에 있던 객체의 상태가 SQL쿼리를 이용해서 DB로 보내진다. 이런 처리는 트랜잭션이 끝날 때가 아니더라도 발생할 수 있다.

"new"라는 상태는 Persistent 객체가 주키를 가졌지만 아직 DB에 들어가지 않은 상태다. 동기화가 발생하기 전까지 "new"상태가 유지된다.

automatic dirty checking 은 트랜잭션 내에서 어떤 Persistent 객체가 수정이 되었는지 찾아내는 ORM 소프트웨어의 전략이다. 하이버네이트는 애플리케이션에서 안보이게(transparent) persistent 상태의 변화를 가능한한 나중에 DB에 반영을 하는데 이것을 transparent transaction-level write-behind 라고 한다.

하이버네이트는 어떤 속성이 변했는지 알 수 있으며 따라서 특정 컬럼만 update하는 것이 가능하다. => 이래서 1-7. 레코드 update하기 에서 session.update(pizza);를 하지 않아도 가능 했던것 같습니다.

delete()를 호출하게 되면 DB table에서 객체에 해당하는 row가 삭제 되며 transient 객체가 된다.

사용자 삽입 이미지


'Hibernate > study' 카테고리의 다른 글

숙제  (0) 2007.01.19
Transaction  (2) 2007.01.02
JUnit 으로 Hibernate 테스트  (0) 2007.01.01
Detached Objects  (0) 2007.01.01
Object identity  (2) 2007.01.01
Persistent Object  (0) 2007.01.01
Study To Do List  (2) 2006.12.29
Transient Object  (0) 2006.12.28
JPA를 필드 위에 써보기  (0) 2006.12.28
@Column 조사  (2) 2006.12.28
JPA(Java Persistent API)가 뭐지..  (2) 2006.12.28
top

Write a comment.