Study To Do List

Hibernate 기초 개념
@Transient
persistence : DB에 메모리에 떠도는 데이터를 영구히 보관한다는 개념
Alternatives for Persistence : SQL은 기본이고, JDBC 직접 조작, DAO 개발, EJB의 EntityBean 사용.. Hibernate,TopLink 같은 ORM.. 등등
그 중에서 왜 하필 ORM을 쓰냐.. 는 질문에 대한 답 : Object/Relational Mismatch
그럼 ORM 중에서 왜.. Hibernate냐 : POJO 기반의 Transparent Persistency를 지원한다
참고할 사이트 : http://javacan.madvirus.net/ (여기서 hibernate 검색 후 나오는 시리즈 물 참조)

DB 기초 개념
join과 같은…


친절한 선생님
을 만나서 공부운이 트였습니다. 감사합니다. 저는 내년에도 더욱 열심히 공부하는 학생이 되겠습니다. 기선아 파이팅!!!

Transient Object

참조 : Hibernate In Action 4.1.1

Transient Object

new라는 키워드를 사용하여 생성된 객체는 그 즉시 persistent 상태가 아니다. 이 상태는 transient상태이며 이것은 DB의 테이블의 어떤 레코드와도 연관이 없으며 따라서 언제라도 참조를 잃게 되면(null 이 되면) 상태에 대한 정보를 잃게 된다.

트랜잭션 관리의 대상이 되지 않는다. 따라서 Transient 객체에는 롤백 기능을 제공하지 않는다.

transient 상태의 객체가 save()의 대상이 되거나 다른 persistent 상태의 객체로 부터 참조되는 경우에 persistent 상태가 된다.

bl100.bmp

JPA를 필드 위에 써보기

기존 코드는 getter위에 어노테이션들을 적용했었는데요. 필드 위에 써도 된다고 합니다. 그래서 한번 실험 삼아 해봅니다. 먼저 pgAdmin으로 기존에 있던 테이블을 지웠습니다.
bk97.bmp그리고 Pizza 클래스를 다음과 같이 어노테이션들의 위치를 getter위에서 필드 위로 이동시켰습니다.

    @Id
    @GeneratedValue(generator = “Pizza_PizzaId_Seq”, strategy = GenerationType.AUTO)
    private Integer pizzaId;

    @Column(nullable = false, length = 50)
    private String name;

    @Column
    private Integer price;

    @Column(length = 50)
    private String size;

    @Column(nullable = false)
    private String toping;

그리고 PizzaApp를 실행했습니다.
bk98.bmp오호 되는군요~

어라! 근데 table이 두 개 입니다. Member 테이블 까지 생겼네요. Member 모델과 MemberApp라는 어플리케이션을 만들어서 실험해본 적이 있었는데 MemberApp를 실행하지 않았는데도 Member 테이블이 생긴이유는…

bk99.bmpapplicationContext-dao.xml의 윗 부분과 같이 설정해 두었기 때문인듯 합니다. 저기서 어노테이션이 붙은 클래스들을 전부 읽어 가기 때문에 PizzaApp가 실행되면서 Member 테이블 까지 만들어 준 것으로 결론이 지어집니다.

@Column 조사

참조 : http://java.sun.com/javaee/5/docs/api/javax/persistence/Column.html
JPA에 포함되어 있는 어노테이션으로 POJO위에 해당 필드가 DB의 컬럼과 매핑이 되도록 설정하는데 사용했었습니다.

사용할 수 있는 속성들로는 다음과 같은 것들이 있습니다.
bk96.bmp
위 속성들은 전부 Optional 이기 때문에 설정하지 않아도 됩니다. 그럴 때는 각 속성들의 default값들로 설정됩니다.

columnDefinition은 해당 컬럼을 생성할 때의 SQL이라고 하는데 잘 모르겠네요. 기본값은 “”
inserttable은 inset가 가능한지 여부를 나타내며 기본 값은 true
length는 해당 컬럼의 길이며 기본 값은 255
name은 이 필드와 매칭 될 컬럼의 이름이며 기본 값은 필드 명으로 들어갑니다.(기본 값은 “”이렇게 써있는데..)
nullable은 필드가 null값을 허용하는지 여부이며 기본 값은 true
precision과 scale은 실수를 나타낼 때 사용하며 기본 값은 0
table은 컬럼이 어느 테이블에 만들어질지 정하는 것 같습니다. 기본값은 primary table이라고 적혀있는데 현재 소속된 클래스의 테이블로 들어가는 것 같습니다.
unique는 해당 컬럼이 uniauq key인지 나타내며 기본값은 false
updatable은 UPDATE sql이 사용가능한지 여부이며 기본값은 true

전부 기본적인 세팅이라서 마치 Java의 멤버 변수들의 기본값 처럼 쉽게 머릿속에 들어옵니다.
하지만 몇몇은 기본값이 “” 라고 되어 있지만 그렇치 않은 것들이 있네요.
columnDefinition(요건 뭔지 잘 모르겠지만), name, table은 기본 값이 “”가 아니고 필드명과 필드가 속해있는 클래스의 테이블명이 되는 것 같습니다.

JPA(Java Persistent API)가 뭐지..

지난 스터디 때 처음 들어본 단어 JPA[footnote]물론 처음 들어본 단어는 이 밖에도 많았지요.[/footnote]를 공부해야 한다는 말씀을 듣었습니다. 설명도 살짝 들었습니다.

EJB와 관련지어 설명해 주셨는데 EJB를 공부해본 적도 없고 경험이 없기 때문에 이해하지 못하고 외울 수 밖에 없었습니다. EJB의 Entity bean과 연관지어 설명해 주신 것이 기억이 나서 찾아 보았습니다.

위키피디아에 있는 Entitry Bean의 정의입니다.

An Entity Bean is a type of Enterprise JavaBean, a server-side Java EE component, that represents persistent data maintained in a database. An entity bean can manage its own persistence (Bean managed persistence) or can delegate this function to its EJB Container (Container managed persistence). An entity bean is identified by a primary key. If the container in which an entity bean is hosted crashes, the entity bean, its primary key, and any remote references survive the crash.

In EJB 3.0, entity beans were superseded by the Java Persistence API.

Entity Bean은 database에서 관리되는 persistent data를 java 프로그램에서 표현하기 위해 사용되는 하나의 타입인 것 같습니다. 이 빈들은 주키로 관리가 되는데…EJB 3.0에서는 JPA에 의해 대체 됐다고 하는군요.

위키피디아에서 JPA를 찾아봤습니다.

The Java Persistence API, sometimes referred to as JPA, is a Java programming language framework that allows developers to manage relational data in Java Platform, Standard Edition and Java Platform, Enterprise Edition applications.

Java 플렛폼 기반으로 관계형 Data를 프로그램에서 다룰 때 사용하는 프레임웍이라는 짧은 설명입니다.

세가지 구성요소를 들고 있는데 다음과 같습니다.(Persistence consists of three areas:)
    * the API, defined in the javax.persistence package
    * the Java Persistence Query Language
    * object/relational metadata
좀더 자세한 내용을 찾고 싶어 sun에서 찾아 보았습니다.
http://java.sun.com/developer/technicalArticles/J2EE/jpa/index.html
J2EE tutorial에서 JPA 부분
J2EE API에서 JPA부분