JPA 와 Hibernate - 스프링의 JDBC 대신에 JPA를이용한 DB 데이터검색작업 - JPA(Java Persistence API) 는자바의 O/R 매핑에대한표준지침이며, 이지침에따라설계된소프트웨어를 O/R 매핑프레임워크 라고한다. - O/R 매핑 : 객체지향개념인자바와관계개념인 DB 테이블간에상호대응을시켜준다. 즉, 객체지향언어의인스턴스와관계데이터베이스의레코드를상호대응시킨다. - O/R 매핑기능을제공해주는소프트웨어를 O/R 매핑프레임워크 라고한다. 대표적인 O/R 매핑프레임워크가 하이버네이트 (hibernate) 이다. - 하이버네이트 : 데이터베이스의어느테이블과자바의어느클래스가서로대응되는지를어노테이션으로정의한다. - O/R 매핑프레임워크를사용하면, DB 접근과데이터취득에대한작업을개발자가작성하지않아도된다. 즉, DB 접속의시작및종료, 데이터조작등의작업을작성할필요가없다. - 스프링환경설정파일에 JDBC에대한내용대신에하이버네이트에대한별도의환경설정파일 (persistence.xml) 을사용한다. - 스프링환경설정파일에서는단지의존성주입에대한선언과 JPA를사용한다는선언을작성한다.( 네임스페이스 p 를사용하면편리하다.) 다음은스프링환경설정파일에 JPA의사용을선언한예 <bean id="entitymanagerfactory" class="org.springframework.orm.jpa.localentitymanagerfactorybean" p:persistenceunitname="persistence.xml 에선언된 <persistence-unit name> 의이름 "> - JPA 의선언에사용된 LocalEntityManagerFactoryBean 클래스는데이터소스나글로벌트랜잭션을이용할수없 으며, 독립형 (stand-alone) 어플리케이션이나간단한테스트인경우에사용한다. - STS 에서 JPA 설정파일만드는방법 (STS 에하이버네이트플러그 - 인설치후 ) - STS의 Help 메뉴에서 install new S/W 선택. - Add 를선택해서하이버네이트의 url을입력. (http://download.jboss.org/jbosstolls/updates/stable) - Jboss Web and JavaEE Development 에서 Hibernate Tools 선택 1 프로젝트에서오른쪽마우스클릭 2 Properties 선택 3 Project Facets 선택 4 Convert to JPA 선택 5 Further Available Configuration 선택 6 Platform 을 Hibernate 로, Type 을 Disable Library Configuration - 위의과정을마무리하면, 프로젝트의 META-INF 에 "persistence.xml" 이생성된다. 이파일을더블클릭해서환경설 정을진행한다. JPA 를사용할때클래스를생성하면, 에러를의미하는적색의마크가나타나는데이것은 persistence.xml 에클래 스가등록되지않아서발생한다. - 1 -
- JPA를사용하는경우의스프링설정파일에다음을기술한다. <bean id="entitymanagerfactory" class="org.springframework.orm.jpa.localentitymanagerfactorybean" p:persistenceunitname="exampleofjpa"> </bean> <bean class="org.springframework.orm.jpa.support.persistenceannotationbeanpostprocessor"> </bean> 동일해야한다. - 다음은 JPA 설정파일인 persistence.xml의예 <persistence-unit name="exampleofjpa"> <provider>org.hibernate.ejb.hibernatepersistence</provider> <class> 매핑에사용되는클래스이름 </class> <class> 매핑에사용되는클래스이름 </class> <exclude-unlisted-classes /> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.oracledialect" /> <property name="hibernate.connection.driver_class" value="oracle.jdbc.driver.oracledriver" /> <property name="hibernate.connection.username" value="hr" /> <property name="hibernate.connection.password" value="hr" /> <property name="hibernate.connection.uri" value="jdbc:oracle:thin:@localhost:1521:orcl" /> <property name="hibernate.show_sql" value="true" /> </properties> </presistence-unit> - 우선, DB 의테이블과자바클래스간의매핑에사용되는클래스 ( 엔터티 ) 를작성한다. @Entity @Table(name="userinfo"); public class implements Serializable { private Integer userid; private String name; private reservation; private Integer teamid; @Id @Column(name="team_id") public Integer getteamid() { return this.teamid; JPA에의해매핑되는클래스임을선언이클래스와매핑되는 DB의테이블이름 ( 클래스이름과테이블의이름이같으면생략가능 ) 이항목은 DB테이블에는없는항목으로검색결과저장에사용된다. primary key에해당하는항목임을선언테이블의 primary key 컬럼이름 ( 클래스의항목이름과테이블의항목이름이같으면생략가능 ) - 2 -
public void setteamid(integer teamid) { this.teamid = teamid; @OneToMany(mappedBy="user") public Set<> get() { return this.reservation; 사용자는다수의예약을가질수있다. 1 대다 의관계를명시한다. mappedby 항목에는상대방클래스에선언된현재클래스의변수이름을기술 public void set(set<> reservation) { this.reservation = reservation; public boolean equals(object other) {... public int hashcode() {... equals() 와 hashcode() 를반드시오버라이드한다. @OneToOne @JoinColumn(name="team_id") public Integer getteamid() { return this.teamid; 외래키가선언되어있음을의미 외래키가참조하는상대방테이블의컬럼이름 public void setteamid(integer teamid) { this.teamid = teamid; - 3 -
- JPQL(Java Persistence Query Language) 란?. 1 JPA를통해서데이터베이스를검색할때사용한다. 2 JPA 프레임워크가 JPQL을 SQL로변환하고 DB를조회한다. 3 SQL은 DB를조회, JPQL은자바클래스를조회 - JPQL의예 FROM AS user WHERE user.name = 'John' 클래스의 name 프로퍼티가 'John' 인 인스턴스를획득. 실제로는 클래스에대응하는 DB 테이블에서데이터를획득한후 user 인스턴스에저장한다. - JPQL 에서의조인예 user_id name 1 kim 2 lee reservation_id user_id reserved_date 1 1 20100101 2 1 20100202 FROM AS user INNER JOIN user.reservation AS reservation Object[0] Object[1] FROM AS user INNER JOIN FETCH user.reservation AS reservation - 4 -
FROM AS user LEFT OUTER JOIN user.reservation AS reservation Object[0] Object[1] user_id=2 FROM AS user LEFT OUTER JOIN FETCH user.reservation AS reservation user_id=2-5 -