복붙노트

[SPRING] Hibernate EntityManager, 그것은 싱글 톤으로 사용되어야 하는가?

SPRING

Hibernate EntityManager, 그것은 싱글 톤으로 사용되어야 하는가?

저는 Spring을 사용하지 않기 때문에 클래스 내에서 EntityManager의 인스턴스를 생성하고 있습니다.

필자는 Hibernate-Eclipse 리버스 엔지니어링을 사용하여 클래스를 자동 생성했습니다. 이 클래스들은 모두 EntityManager의 인스턴스를 가지고있다.

나는 EntityManager와 Hibernate가 어떻게 작동하는지 100 % 확신하지 못한다. 그래서이 클래스 (EntityManager)의 인스턴스가 너무 많아서 트랜잭션에 문제가 있을지 궁금하다.

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

편집 : @PersistenceContext라는 뭔가가 나타납니다 인스턴스 변수에 콩으로 내 persistence.xml로드 할 것,이 기능을 봄 필요합니까? (결코 주입되지 않았기 때문에 널 포인터 예외가 발생 함)

@persistencecontext를 사용하려고하는 곳의 코드를 잘라냅니다.

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

내 persistence.xml

    <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>

해결법

  1. ==============================

    1.이 기사보기 : JPA 아키텍처에서는 매우 잘 설명합니다.

    이 기사보기 : JPA 아키텍처에서는 매우 잘 설명합니다.

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

    Clairification : 다른 작업 단위에 대해 단일 Entity Manager를 사용하지 마십시오. 한 작업 단위에서 일반적인 하나의 트랜잭션, 한 작업 단위의 다른 트랜잭션이있는 경우 동일한 Entity Manager를 사용할 수 있습니다

    Spring을 사용한다면 @PersistenceContext 어노테이션을 사용하여 EntityManager를 삽입하면 스프링이 처리한다. 기본값으로 Spring은 삽입 된 EntityManager를 (프록시를 통해) 현재 트랜잭션에 "바인딩"합니다. (트랜잭션은 스레드에 "바인딩"됩니다.)

    @See Spring Reference 13.5.2 일반 JPA를 기반으로 DAO를 구현한다. 코드 예 뒤에 흥미로운 paragagraph가있다.

  2. ==============================

    2.클래스에 객체를 삽입하려면 Spring이나 Google Guice와 같은 의존성 삽입 프레임 워크가 필요합니다. 그렇지 않으면 자동으로 삽입되지 않을 수 있습니다.

    클래스에 객체를 삽입하려면 Spring이나 Google Guice와 같은 의존성 삽입 프레임 워크가 필요합니다. 그렇지 않으면 자동으로 삽입되지 않을 수 있습니다.

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

    엔티티 관리자의 단일 인스턴스에 관해서는 jpa 트랜잭션으로 엔티티 관리자를 묶어서 인스턴스와 트랜잭션을 관리하기 때문에 Spring으로 가면 필요 없다고 생각합니다.

  3. from https://stackoverflow.com/questions/9370819/hibernate-entitymanager-is-it-supposed-to-be-used-as-a-singleton by cc-by-sa and MIT license