-object-relational mismatch 종류 5가지
-> 세분성(granularity)), 상속(inheritance),일치성(identity), 순회(navigation), *연관(Associations)
-> 자바에서는 객체의 레퍼런스로 (방향성 존재) VS RDBMS에서는 외래키 이용해서(방향성 없음)
-> 종류 1) one to one/ one to many( join column 방법 , join table 방법- Set)
-hibernate architecture : DAO, Hibernate API, Hibernate, domian object, JDBC API, JDBC, SessionFactory
configuration -> session Factory -> session -> session이 JDBC 이용해 DB 접근
-Hibernate가 가지는 객체
1) configuration object : 2가지 정보 가짐
- db connection information( hibernate.cfg.xml)
2.mappign information(mapping class) ->
@Entity,
@Table(name="product"),@Id,@GeneratedValue,@Coumn(name="pro_id"), @ManyToOne(cascade=CascadeType.ALL),@JoinColumn(name="cat_id")
2)SessionFactory Object : SessionFactory.openSession() / SessionFactory.getCurrentSession()
@Transactional
public class PersonService{
@Authowired
private SessionFactory sessionFactory;
public Person edit(Integer id) {
Session session = sessionFactory.getCurrentSession();
Person person = (Person) session.get(Person.class, id);
session.update(person);
return person;
}
}
3)Session Object : DB의 매핑된 entity class의 인스턴스에 대하여 CRUD operation 수행 , DB와 Session 사이에 cache 존재 ->flush() 필요
-3-1) Object States : entity classes 인스턴스들의 객체 상태 3가지
Transient (DB와 연결 안된 new 인스턴스) -> persistent (session과 연결된 상태) -> Detached (연결 해제됨)
Transient에서 save() or saveOrUpate() -> persistent됨
Persistent에서 delete() -> 다시 Transient됨
Persistent에서 close() -> Detached됨
Detached에서 update() or saveOrUpate() -> 다시 persistent됨
Persistent 상태에서 save() 안 해도 변경사항 DB에 저장됨
-3-2) Session Methods : get(), saveOrUpdate(), delete(), flush(), close() , createQuery()
get() : class에 매핑되는 table에서 id에 해당하는 레코드 읽어서 persistent 인스턴스 반환
save() : 객체 저장 + cascade="save-update"하면 연관된 것도 저장
saveOrUpeate() : DB에 이미 있으면 save() 대신
delete() : DB에서 제거 + cascade="delete"하면 연관된 것도 삭제
flush() : session 메모리에 있는 persistent 객체와 DB와 실제로 동기화 / 트랜잭션 커밋하고 세션 닫기 전에 호출해야함
flush mode ) Always, Commit, Manual, Auto -> hibernate.cfg.xml에서 설정
<property name="org.hibernate.flushMode" value ="COMMIT"/>
close() : spring이 해주긴 함
createQuery() : HQL 사용하여 쿼리 객체 생성 (table/column명 대신 class명,멤버변수 사용)
Query<Product> theQuery = session.createQuery("from Product", Product.class); //쿼리 생성
List<Product> products = theQuery.getResultList(); //쿼리 사용
4)Transaction Object
하나의 작업으로 봄 -> 모든 commit 성공해야 transcation 성공/ 실패 시 rollback으로 다시
5)Query Object : Session.createQuery()에 의해 객체 얻음
query.getResultList();//조회 , query.executeUpdate()//업데이트
*update/delete query 시 주의 : 타입 명시 없는 대신 @suppressWarnings("rawtypes") 넣기