2010-03-17 2 views
3

설명 웹 애플리케이션에서 Hibernate 객체 (db 테이블에 매핑 됨)의 일반적인 수명주기를 설명하십시오. 개체의 새 인스턴스를 만들고 db에 유지한다고 가정합니다. 그러나 응용 프로그램 수명 동안 분리 된 개체에서 작업 할 것이며 결국 데이터베이스를 종료 할 때 업데이트해야합니다. 최대 절전 모드와 스프링 모드는 어떻게 생겼습니까?웹 응용 프로그램에서 Hibernate 객체의 전형적인 수명주기 -?

p.s. 서블릿 전환 사이에 트랜잭션과 세션을 사용할 수 있습니까? 그래서 우리는 하나의 세션을 열고 그것을 다시 열 필요없이 모든 서블릿에서 사용 했습니까?

설명이있는 예제를 제공하려고합니다. 앱이 시작되면 로그 레코드가 생성된다고 가정합니다. 이 작업은 한번에 할 수 있습니다. Log log = new Log (...) save (log) - log는 테이블 LOG에 해당합니다.

응용 프로그램에서 사용자 입력을 처리하고 계속 진행하면서 새로운 데이터가 누적됩니다.

두 번째 단계 이후에 우리는 예를 들어, 로그 개체 컬렉션을 뭔가를 추가 할 수 있습니다

// 이제 우리가 선택한 어떤 사용자의 추적이 : 설정 thisUserChoice을 는 // 그래서 우리는을 업데이트 할 수 있습니다 영구 객체, 우리는 지금 새로운 데이터를 가지고 있습니다! // log.userChoices = thisUserChoice.

내 질문의 성격이 여기에 있습니다. 사용자가 새로운 데이터를 얻을 때마다 데이터베이스를 업데이트하려면 어떻게 처리해야합니까?

관계형 모델에서는 행 ID로 작업 할 수 있으므로이 레코드를 가져와 행의 다른 데이터를 업데이트 할 수 있습니다.

Hibernate에서 우리는 id에 의해 객체를로드 할 수있다.

하지만 IT가 나아갈 길은 무엇입니까? 어떤 것이 든 더 좋습니까?

답변

3

당신은 하나의 세션에서 모든 것을 할 수 있습니다. 그러나 그것은 하나의 수업으로 모든 것을하는 것과 같습니다. 그것은 초보자의 관점에서 이해할 수 있지만, 실제로 그렇게하는 사람은 없습니다.

웹 응용 프로그램에서는 일반적으로 여러 스레드가 동시에 실행되어 각각 다른 사용자를 처리 할 것으로 예상 할 수 있습니다. 일반적으로 각 스레드는 별도의 세션을 가지며 세션은 해당 사용자가 실제로 필요로하는 객체의 인스턴스 만 관리합니다. 자신의 코드에서 동시성을 완전히 무시할 수있는 것은 아니지만 최대 절전 모드 도움말을 사용하는 것이 좋습니다. 하나의 세션으로 모든 것을 처리하려면 모든 동시성 관리를 직접해야합니다.

하이버 네이트는 하나의 데이터베이스와 통신하는 애플리케이션 서버가 여러 개인 경우 동시성을 관리 할 수도있다. 별도의 JVM은이 경우 동일한 세션을 공유 할 수 없습니다.

수명주기는 hibernate documentation에 설명되어 있습니다.

요청이 웹 클라이언트에서 서버로 전송 될 때마다 가장 먼저해야 할 일은 관련 개체 (10.3 절 참조)를로드하여 처리 할 분리 된 개체가 아닌 영구적 인 개체를 유지하는 것입니다. 그런 다음 필요한 모든 작업을 수행합니다. 세션이 닫히면 (즉, 서버가 클라이언트에 응답을 반환 할 때) 데이터베이스에 모든 업데이트를 기록합니다. 또는 작업에 새 항목을 만드는 작업이 포함 된 경우 임시 항목 (예 : new)을 만든 다음 persist() 또는 save() (10.2 절 참조)를 호출해야합니다. 이렇게하면 관리되는 엔티티가 생기게됩니다. 변경 사항을 더 많이 수행 할 수 있으며, 세션이 닫힐 때 최대 절전 모드로 변경 사항이 기록됩니다.

분리 된 개체를 사용하지 마십시오. 하지만 (아마도 사용자의 session에 저장해야하는 경우) 데이터베이스에 저장해야 할 때마다 update()를 사용해야합니다 (10.6 절 참조). 이렇게하면이를 관리 객체로 변환하므로 세션이 닫히면 데이터베이스에서 변경 내용을 저장합니다.

스프링은 요청마다 새로운 세션을 생성하는 것을 매우 쉽게 만듭니다. 일반적으로 Spring에게 sessionFactory를 생성하도록 요청하면 모든 요청에 ​​자체 세션이 주어집니다. "spring hibernate tutorial"을 검색하면 여러 가지 예가 있습니다.

+0

@ 존 새 개체를 유지하면 데이터베이스에 저장되므로 동시성은이 ID를 가진 한 행만 존재할 수 있으므로 의미가 없습니다. 두 개의 스레드가 서로 다른 세션에서 실행되는 경우에도 동일한 인스턴스를 db에 유지할 수 없습니다. 그리고 모든 다음 스레드는 새로운 세션을 엽니 다. 여기서 잘못된 것이 있으면 저를 바로 잡으십시오. – EugeneP

+0

정확합니다. 일반적으로, 당신은 최대 절전 모드에서 id 할당을 허용합니다. 두 개의 쓰레드는 새로운 객체를 지속시킬 수 있고, 하이버 네이트는 다른 객체를 얻을 수있다. 10.2 절의 "persist()"는 일시적인 인스턴스를 영속적으로 만들지 만 식별자 값이 영속 인스턴스에 즉시 할당되는 것을 보장하지는 않으며, 할당은 플러쉬 타임에 발생할 수도 있습니다. 트랜잭션 경계 밖에서 호출 된 경우 INSERT 문을 실행하십시오. 이것은 확장 된 세션/지속성 컨텍스트가있는 장기 실행 대화에 유용합니다. " – John

2

http://scbcd.blogspot.com/2007/01/hibernate-persistence-lifecycle.html 일시적인 영구 객체에 대해 설명합니다.

또한 최대 절전 모드가 무엇을 알 수있는 라이프 사이클 interface를 보라 (그리고 사용자가 무언가를하는 것은 모든 단계에서 훅을 제공)

+0

흥미 롭지 만 첫 번째 기사에서는 분리 된 개체를 영구 상태로 되 돌리는 방법을 예제에서는 설명하지 않고 단어로만 설명합니다. – EugeneP

관련 문제