• 영속성 컨텍스트란 무엇인가.
        • 실제 DB 저장하는 것이 아니라 
        • 엔티티를 "영속컨텍스트에" 저장한다는 의미이다.

          • JPA 이해하는데 가장 중요한영어
          • "엔티티를 영구 저장하는 환경"이라는 의미를 가진다.
          • EntityManager.persist(entity)
          • 매니저(EntityManager)를 통해 영속성 컨텍스트(persistence)에 접근한다.
        • 비영속 컨텍스트
          • 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
          • JPA 관리하지 않는 상태
      //객체를 생성한 상태(비영속)
      
      Admin admin = new Admin();
      
      admin.setId("member1");
      
      admin.setUsername("회원1");
      
      //영속상태
      em.persist()

       

       

      • 준영속 (detached)
        • 영속성 컨텍스트에 저장되었다가 분리된 상태 
          //
          회원 엔티티를 영속성 컨텍스트에서 분리, 준영속 상태
        • em.detach()
      Admin admin = em.find(Admin.class , 101L);
      admin.setName("AAAAAA");
                  
      //JPA에서 관리하지 않는다. 
      em.detach(admin);
      
      //영속성 컨테스트의 내용을 전부 초기화 
      em.clear();

       

      • 그렇다면 영속성 속성을 클리어하고 다시 조회 하게 어떻게 될까 ? 
        • 아래의 예시를 보면 "em.clear" 또는 em.detach를 사용시에는 영속성관리를 하지 않게 됨으로 
        • admin 과 admin1은 1차캐시된 데이터를 가져오지 않으므로  false가 나오게 된다. 

       

                  Admin admin = em.find(Admin.class , 101L);
                  admin.setName("AAAAAA");
      
                  //JPA에서 관리하지 않는다.
                  em.detach(admin);
      
                  em.clear();
      
                  Admin admin1 = em.find(Admin.class,101L);
      
                  System.out.println(admin == admin1);

       

       

      • 영속이란 
        • 실제 영속컨테스트가 관리하는 1차캐시에 데이터가 없으면 DB에서 데이터를 가져와 캐시에 담아 JPA가 관리하는 것 
      • 데이터의 동일성
        • JPA "영속엔티티" 동일성을 보장해준다.
        • 1 캐시로 반복가능한 읽기(RePEATABLE READ) 등급의 트랜잭션 격리 수준을 데이터베이스가 아닌 애플리케이션 차원에서 제공
      • 엔티티 수정 감지
        • JPA 변경감지 기능이 있어서 "엔티티" 변경
        • JPA 자바의 Collection 변경하듯이 "값만 변경했지만update 되었다 .

                  Admin admin = em.find(Admin.class,101L);

                  admin .setName("나승후1111");

       

      ORM(Object Relation Mapper Framework) - Hibernate 이용




      [ hibernate 의 장점 ]

      =>ORM: 테이블의 행과 클래스의 객체를 매핑시켜서 데이터베이스를 연동하는 방식

      => SQL 없이 데이터베이스 연동 가능

      =>SQL Mapper Framework 인 MyBatis 보다 성능이 우수

      [ 사용 전 생각해볼 것 ]

      =>spring-orm 과 hibernate 라이브러리가 있어야 합니다.

      =>VO 클래스가 반드시 있어야 합니다.

      =>VO 클래스와 데이터베이스 테이블을 연결하는 설정 파일이 있어야 합니다.

      =>LocalSessionFactoryBean  과 PersistencyExceptionTranslationPostProcessor 클래스의 bean이 필요

      =>Transaction을 반드시 적용해야 합니다.

      [session과 sessionFactory] 

      sessionFactory는 Session 객체를 반환 하는 메소드를 제공한다 

      session은  org.hibernate.Session 인터페이스이며, insert, update, delete 

      그리고 Transaction, Query, Criteria 를 생성하는 factory 메소드를 제공한다

      session은 인터페이스 이기때문에 구현해서 사용해야한다 그렇기에 sessionFactory에서 객체를 반환해서 사용한다. 



      [1. 저장소 설정] 

      <!-- 저장소 설정 -->

      <repositories>

      <repository>

      <id>codelds</id>

      <url>https://code.lds.org/nexus/content/groups/main-repo</url>

      </repository>

      </repositories>




      [ 2.pom.xml 파일에서 의존성 설정 ]



      <!-- spring 에서 hibernate와 같은 ORM 프레임워크를 사용하기 위한 라이브러리 -->

      <dependency>

      <groupId>org.springframework</groupId>

      <artifactId>spring-orm</artifactId>

      <version>${spring-framework.version}</version>

      </dependency>


      <!-- Hibernate -->

      <dependency>

      <groupId>org.hibernate</groupId>

      <artifactId>hibernate-entitymanager</artifactId>

      <version>${hibernate.version}</version>

      </dependency>


      <!-- spring jdbc 의존성 설정을 위한 dependency>

      <dependency>

      <groupId>org.springframework</groupId>

      <artifactId>spring-jdbc</artifactId>

      <version>${spring-framework.version}</version>

      </dependency>

      <!--오라클 사용을 위한 의존성 설정-->

      <dependency>

      <groupId>com.oracle</groupId>

      <artifactId>ojdbc6</artifactId>

      <version>11.2.0.3</version>

      </dependency>




      [ 3. 하이버 네이트 매핑 파일 설정 ]



      => resources 디렉토리에 만들면 안되고 java 디렉토리 안에 패키지 안에 생성해야 합니다.


      <?xml version="1.0"?>

      <!DOCTYPE hibernate-mapping PUBLIC

      "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 

      "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">




      [ 4. primary key 설정 ]


      <?xml version="1.0"?>

      <!DOCTYPE hibernate-mapping PUBLIC

      "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 

      "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">


      <hibernate-mapping package="hibernate.domain">

      <class name="DTO  or VO 클래스" table="DB테이블이름">

      <!--primary key 설정 -->

      <id name="code" column="CODE" />

      <!-- primary key를 제외한 나머지 프로퍼티 설정 -->


      <!-- name의 setter column은 Db의 컬럼이름 -->

      <property name="name" column="NAME" />

      <property name="manufactuer" column="MANUFACTURE" />

      <property name="price" column="PRICE" />

      </class>

      </hibernate-mapping>


      [5.Hibernate를 이용해서 데이터베이스 작업을 수행할 GoodDao 클래스를 만들고 데이터를 삽입하는 메소드를 구현 ]

      => hibernate를 사용할 때는 SessionFactory를 주입받아서 사용합니다. 


      package hibernate.dao;


      import org.hibernate.Session;

      import org.hibernate.SessionFactory;

      import org.springframework.beans.factory.annotation.Autowired;

      import org.springframework.stereotype.Repository;


      import hibernate.domain.Good;


      @Repository

      public class GoodDao {

      //Hibernate 사용을 위한 참조형 변수 

      @Autowired

      private SessionFactory sessionFactory;

      //데이터를 삽입하는 메소드 

      public void insertGood(Good good) {

      // sessionFactory 를 통해 세션객체 생성 

      Session session = sessionFactory.getCurrentSession();

      session.save(good);

      }

      }



      [<!-- DataSource 클래스의 Bean: 데이터베이스 접속 정보 저장  -->]

      <bean id="dataSource"

      class="org.springframework.jdbc.datasource.DriverManagerDataSource">

      <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />

      <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" />

      <property name="username" value="system" />

      <property name="password" value="wnddkd" />

      </bean>


      [<!-- 데이터베이스 작업 도중 예외가 발생하면 Spring의 예외로변경해서 발생시키기 위한 설정-->]

      <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />


      [<!-- 하이버네이트 사용을 위한 클래스 -->]

      <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">

      <property name="dataSource" ref="dataSource" />

      <!--하이버네이트 매핑주소-->

      <property name="mappingResources">

      <!-- 여러개 입력이 가능하기 때문에 LIST -->

      <list>

      <value>dao/good.hbm.xml</value>

      </list>

      </property>


      <!-- 데이터 베이스 종류 --> 

      <property name="hibernateProperties">

      <value>

      <!--다른 데이터베이스 쓰라고 하면 검색해서 사용 -->

      hibernate.dialect=org.hibernate.dialect.Oracle10gDialect

      </value>

      </property>

      </bean>


      <!--반드시 사용해야하는 트랜잭션 2개-->

      <!--하이버네이트 트랜잭션 매니저 객체 만들기   -->

      <!--하이버네이트는 트랜잭션을반드시 사용해야합니다. 

      <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">

      <property name="sessionFactory" ref="sessionFactory" />

      </bean>

      <!-- 트랜잭션 사용을 위한 설정을 추가 -->

      <tx:annotation-driven/>



      <!-- 어노테이션 설정을 스프링 프로젝트에서 사용하기 위한 설정  -->

      <context:annotation-config />

      <!-- 객체를 자동으로 생성해 줄 패키지 설정  -->

      <context:component-scan base-package="hibernate" />



      + Recent posts