bk90.bmp
Hibernate In Action 4.1.1 Transient Object 처음에 나오는 그림입니다. Hibernate에서 사용되는 객체의 상태 변화를 보여주고 있습니다.

  • Transient는 DB와 아무 연관이 없는 상태입니다.
  • Persistent는 DB와 동기화 되어 있는 상태입니다.
  • Detached는 DB와 동기화 된 적이 있는 상태입니다.

소스코드와 연관 시켜 보겠습니다.

        Pizza pizza = new Pizza();
        pizza.setName("ines's pizza");
        pizza.setPrice(10000);
        pizza.setSize("Large");
        pizza.setToping("Kimchi");

        s.save(pizza);

        pizza.setPrice(15000);

        tx.commit();
        s.close();

        pizza.setPrice(20000);

위 소스크드와 그림을 보시면서 Pizza 객체의 상태를 추적해 보겠습니다. 먼저 new를 하여 객체를 생성하게 되면 이 객체는 transient 상태가 됩니다. 그 후에 s.save(pizza);를 하게 되면 Persistent 상태가 되는데 그렇기 때문에 이 전 글에서 s.update(pizza); 를 호출하지 않아도 DB와 동기화 되어 있는 상태이기 때문에 update가 된 것 같습니다. 그 뒤 s.close()를 호출하면 그 뒤 부터는 DB와 동기화 된 적은 있지만 현재는 그렇지 않은 Detached 상태가 됩니다.

new를 만나면 Transient => save() 이후 부터는 Persistent => close() 이후 부터는 Detached 상태 입니다.

Transient 상태와 Detached 상태의 차이점은 Transient 상태에서 Pizza의 pizzaId라는 속성은 null인 상태입니다. 하지만 Detached 상태는 DB와 동기화 된 적이 있기 때문에 pizzaId 속성에 값을 가지고 있습니다.