2012-02-21 4 views
5

나는 스프링을 사용하지 않으므로 클래스 내에 EntityManager의 인스턴스를 만들고있다.Hibernate EntityManager, 그것이 싱글 톤으로 사용되어야합니까?

클래스를 자동 생성하기 위해 Hibernate-Eclipse 리버스 엔지니어링을 사용했습니다. 이러한 클래스에는 모두 EntityManager의 인스턴스가 있습니다.

Hibernate가 EntityManager와 함께 작동하는 방법을 100 % 확신하지 못해서,이 클래스 (EntityManager)의 인스턴스가 너무 많아서 트랜잭션에 문제가 있을지 궁금하다.

다른 모든 클래스에 대해 EntityManager의 정적 인스턴스를 배포하는 별도의 클래스를 만들어야합니까? 아니면 상관 없습니까?

EDIT : @PersistenceContext라고하는 뭔가가 있습니다. 인스턴스 변수에 내 persistence.xml을 bean으로로드하지 않는 것 같습니다.이 기능에는 스프링이 필요합니까? 나는 당신이 종속성을 필요

<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
      version="2.0"> 
    <persistence-unit name="manager1" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 

     <properties> 

     <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> 
     <property name="javax.persistence.jdbc.user" value="root"/> 
     <property name="javax.persistence.jdbc.password" value="mypassword"/> 
     <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/ptbrowserdb"/> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/> 
     </properties> 
    </persistence-unit> 
</persistence> 
+0

('EntityManager '에서) 개인 액세스 수정자를 제거하고 테스트 할 수 있습니까? – Santosh

답변

10

이 기사를 참조하십시오 : JPA Architecture 아주 잘 설명합니다.

일반적으로 트랜잭션 당 하나의 Entity Manager가 필요합니다. 그리고이 엔티티 관리자는 동시에 두 개의 트랜잭션에서 사용되어서는 안됩니다.

명확화 : 다른 작업 단위에 대해 단일 Entity Manager를 사용하지 마십시오. 당신은 하나 개의 작업 단위의 다른 트랜잭션을 경우 스프링을 사용하는 경우가 @PersistenceContext 주석을 사용하는 경우 일반적인 하나의 트랜잭션은 하나 개의 작업 단위로, 당신은 다음 봄 당신을 위해 처리 이렇게 같은 엔티티 관리자

을 사용할 수 있습니다 EntityManager를 삽입한다. Per default Spring은 삽입 된 EntityManager를 (프록시를 통해) 현재 트랜잭션에 "바인딩"합니다. (트랜잭션은 쓰레드에 "묶여"있습니다.)

@See Spring Reference 13.5.2 Implementing DAOs based on plain JPA - 코드 예 뒤에 흥미로운 paragagraph가 있습니다.

+0

당신은 트랜잭션 당 하나의 엔티티 관리자가 필요하지 않습니다. 하나의 엔티티 관리자는 데이터베이스에 대한 하나의 열린 세션 (연결)을 나타내며 하나의 트랜잭션에 사용하는 것은 매우 비쌉니다. 1 회의 세션 당 작업이 반 패턴으로 간주됩니다! https://developer.jboss.org/wiki/Sessionsandtransactions – Maurice

+0

@Maurice : 이것은 흥미로운 기사이지만, Hibernate의 "오래된"Session/SessionFactory 모델에 관한 것이지만이 질문은 JPA에 관한 것입니다. JPA와 Hibernate-Session이 다른 드문 주제들 중 하나에서 나는 이것을 알고있다. https://docs.jboss.org/hibernate/entitymanager/3.6/reference/en/html/transactions.html의 "5.1 엔티티 관리자 및 트랜잭션 범위"장을 살펴보십시오. EntityManager는 저렴합니다. , 단일 비즈니스 프로세스, 단일 작업 단위 (UOW)에 대해 한 번 사용해야하는 비 스레드 세이프 (non-threadsafe) 객체입니다. – Ralph

+0

하나의 비즈니스 프로세스가 여러 트랜잭션으로 구성 될 수 있습니까? 아니면 동의하지 않습니까? 그들은 내 링크에서 세션에 하나 이상의 트랜잭션을 넣어야한다고 말하면 그렇지 않은 경우 반 패턴이 될 것이라고 말하지 않습니까? – Maurice

1

@PersistenceContext(unitName = "manager1") 
private EntityManager entityManager; 

내 persistence.xml을 @PersistenceContext 사용하려고 곳에서 코드의

싹둑를 (이 주입되지 않았기 때문에, 널 포인터 예외가) Spring이나 Google Guice와 같은 사출 프레임 워크는 클래스에 객체를 주입하지 않으면 자동으로 주입되지 않을 수 있습니다.

기본적으로 JPA에서 제공하는 주석으로 최대 절전 모드 나 다른 ORM 프레임 워크와 연동하여 작동하지만 DI 프레임 워크를 사용하여 개체를 주입해야합니다.

엔티티 관리자의 단일 인스턴스와 관련하여 엔티티 관리자를 jpa 트랜잭션과 연결하여 인스턴스와 트랜잭션을 관리하므로 Spring을 거쳐야 할 필요는 없다고 생각합니다.

+1

J2EE에서는 외부 종속성 주입 프레임 워크가 필요하지 않습니다. 주사는 컨테이너에 의해 처리됩니다. – Santosh

+0

당신은 의존성 주입 프레임 워크가 필요하지 않습니다 : 당신은 스스로 할 수 있습니다 : 웹 어플리케이션에서 엔티티 관리자와 EntityManagerPerRequestPatternFilter를 보유한 트레드 예를 들어 – Ralph

+0

@Ralph - 그렇습니다. 오버 헤드를 피하기 위해 우리는 DI..spring 또는 guice에 대한 프레임 워크를 통해 입증되었습니다.이 스택은 애플리케이션 스택의 일부가되어야합니다. – raddykrish

관련 문제