Skip to content
samerook edited this page May 1, 2012 · 68 revisions

Android ORM의 설명과 현재버전, 구현 기능 목록 등을 위한 공간입니다. 여기서 사용법을 익히십시오.

**[Get Started](Get Started)**

1. Android ORM - JPA
>> 자바 퍼시스턴스 API(Java Persistence API, JPA)는 관계형 데이터베이스에 접근하기 위한 표준 ORM 기술을 제공하며, 기존에 EJB에서 제공되던 엔티티 빈(Entity Bean)을 대체하는 기술이다. JAP는 220에서 정의된 EJB 3.0 스펙의 일부로 정의가 되어 있지만, JPA는 EJB 컨테이너에 의존하지 않으며 EJB, 웹 모듈 및 Java SE 클라이언트에서 모두 사용이 가능하다. 또한, JPA는 사용자가 원하는 퍼시스턴스 프로바이더 구현체를 선택해서 사용할 수 있다. - EntityManager
EntityManager em = EntityManagerFactory.getEntityManager();
EntityManager API는 하나의 특별한 작업 단위에서 하나의 데이터베이스에 접근하는데 사용된다. 그것은 영속 엔티티 인스턴스들을 생성시키고 제거시키는데, 그것들의 PRIMARY KEY 동일성(identity)로서 엔티티들을 찾는데, 그리고 모든 엔티티들에 대해 질의하는데 사용된다. - create
DatabaseOpenHelper databaseHelper = new DatabaseOpenHelper(this);
EntityManager em = EntityManagerFactory.getEntityManager();
entityManager.createTable(My.class);
- insert / update
EntityManager em = EntityManagerFactory.getEntityManager();
em.getTransaction().begin();
MyClass my = new MyClass(“something”);
em.persist(my);
em.getTransaction().commit();
- find
EntityManager em = EntityManagerFactory.getEntityManager();
em.getTransaction().begin();
MyClass my = em.find(My.class, index);
em.getTransaction().commit();
- delete
DatabaseOpenHelper databaseHelper = new DatabaseOpenHelper(this);
EntityManager em = EntityManagerFactory.getEntityManager();
entityManager.dropTable(My.class);
- SQLite / Java Type Mapper
>> ColumnType : UNDEFINED, INTEGER, REAL, NUMERIC, TEXT, BLOB, NONE
  1. Troubleshooting
  2. Annotation recipes
  • Table
    @Table
    public class Music {
    ...
    }
    
  • Column
    @Column
    private String imageUrl;
    @Column
    private boolean isPlaying;
    @Column
    private byte[] bitmap;
    

속성값 : PRIMARY KEY / AUTOINCREMENT

@Column
@GeneratedValue(strategy=GenerationType.SEQUENCE)
private Integer id;
  • OneToOne
    >> 테이블간 1:1 매핑이 있을 경우에 각각의 Entity 클래스를 정의하고 클래스간 관계를 OneToOne 매핑으로 처리한다.
@Entity
public class Employee {
   @OneToOne
   private TravelProfile profile;
} 
@Entity
public class TravelProfile {
   @OneToOne
   private Employee employee;
}

위의 예를 보면 Employee 와 TravelProfile가 각각 OneToOne이라는 Annotation을 기재하여 매핑처리한 것을 알수 있다.

작동확인 코드

@Table
public class Music {
...
@Column
@OneToOne
private Event event;
}
  • ManyToOne
    @Column
    @ManyToOne
    private My my;
    
  1. Criteria
  • Criteria API 사용한 데이터 조회
    >> Criteria API는 Criteria가 제공하는 메소드를 사용해서 데이터 조회와 관련된 조건을 입력한다. 즉, Criteria API는 좀더 객체 지향적인 형태로 검색 조건을 명시할 수 있도록 해 준다.
  • Criteria 기본 사용 형태
    >> Criteria API는 net.sf.hibernate.Criteria 인터페이스를 사용해서 검색 조건을 생성하는데, 다음과 같이 Session.createcriteria() 메소드를 사용해서 기본 검색 조건을 갖는 Criteria 인스턴스를 생성할 수 있다.
    Criteria crit = session.createCriteria(My.class);
    List list = crit.list();
    
  1. [Native Query](Native Query)
  • 기본적으로 CRUD 작업을 할 때 JPA 기본 API를 사용하거나 QL을 이용하여 수행한다.
    그러나 특정 DBMS에서 제공하는 기능을 사용할 수 있도록 하기 위해 Native SQL 사용을 지원한다.

    entityManager.createNativeQuery() 메소드를 이용하여 Native SQL을 실행할 수 있다.

    JPA SPEC
StringBuffer qlBuf = new StringBuffer(); 
   qlBuf.append("SELECT * ");
   qlBuf.append("FROM DEPARTMENT ");
   qlBuf.append("WHERE DEPT_NAME like :condition ");
   qlBuf.append("ORDER BY DEPT_NAME"); 
   Query query = em.createNativeQuery(qlBuf.toString(),Department.class);
   query.setParameter("condition", "%%"); 
   List deptList = query.getResultList();

위와 같이 정의된 SQL문을 통해 조회 조건에 맞는 Department 객체의 List가 리턴된다.
WHERE절에서 ':'을 사용하여 Named Paramenter를 통해 조회 조건을 완성할 수 있다.
조회 조건의 값은 Query의 setParameter() 메소드를 통해 지정해 주고 있다.
또한, createNativeQuery의 두번재 인자로 리턴받고자하는 Entity 클래스(Department.class)를 지정한 것을 확인할 수 있다.

작동확인 코드

Query query = entityManager.createNativeQuery("SELECT * FROM Music WHERE artist = :artist", Music.class);
Music music = (Music) query.setParameter("artist", "Sunyong").getSingleResult();
System.out.println(music);
  1. 캐시 활용 정책
  • DB 엑세스를 최소화 하기 위한 캐시 기능 지원
  • persist / find 등에 대해 내부적으로 지원
  • 어노테이션 정보를 캐싱하여 Entity 구조분석 속도 향상
  1. [Get Entity by ID](Get Entity by ID)
  • Method
    javax.persistence.EntityManager
T find(
  Class entityClass,
  Object primaryKey
)

Find by primary key. Search for an entity of the specified class and primary key.
If the entity instance is contained in the persistence context, it is returned from there.

Employee employee = em.find(Employee.class, 1);
Employee managed = employee.getManager();

작동확인 코드

music = entityManager.find(Music.class, new Long(19));
System.out.println(music);
  1. [Android DB 확인하기](Android DB 확인하기)

Clone this wiki locally