hibenate (10) 양 방향 관련 관계 의 CRUD
저장
1、
하나의 group 에 여러 개의 user 가 있다 고 가정 하면 한 user 는 하나의 group 에 만 속 합 니 다. user 대상 을 데이터베이스 에 저장 할 때 가능 합 니 다.
User u = new User();
u.setName("u1");
Group g = new Group();
g.setName("g1");
u.setGroup(g);
Session s = sessionFactory.getCurrentSession();
s.beginTransaction();
s.save(g);// hibernate
s.save(u);
s.getTransaction().commit();
hibenate 는 기본적으로 group 대상 을 저장 하지 않 습 니 다. 설정 해 야 합 니 다.
@ Many ToOne 에는 속성 캐 스 케 이 드 (직렬 연결) 가 있 습 니 다. 캐 스 케 이 드 타 입 은
(1) ALL: 모든 작업 시 현재 대상 에 대한 모든 연결 대상 은 hibenate 에서 작 동 합 니 다.
(2) MERGE: merge () 방법 을 호출 할 때 (통합 할 때) 직렬 연결 (MERGE = save + update)
(3) PERSIST: persist () 방법 을 호출 할 때 (저 장 된 경우) 직렬 연결
(4) PEFRESH: 하나의 session 이 데이터베이스 에서 대상 과 연 결 된 대상 을 메모리 로 로드 하고 다른 session 이 데이터베이스 에서 이 대상 을 수정 하면 hibenate 는 첫 번 째 sesson load 의 대상 을 연결 하 는 대상 에 게 리 셋 작업 을 합 니 다 (A 안쪽 은 B 개 선 된 데 이 터 를 읽 어야 합 니 다)
(5) REMOVE: 삭제 시 직렬 연결
(캐 스 케 이 드 의 속성 은 어떤 조작 을 할 때 관련 대상 이 연결 되 어 있 는 지 를 가리킨다)
테스트: User 클래스 의 getGroup () 방법 에 있 는 @ ManyToOne 주 해 를 @ ManyToOne (cascade = (Cascade Type. ALL) 으로 수정 한 다음 위 코드 블록 에 있 는 s. save (g) 를 주석 하면 실행 프로그램 에서 group 이 hibenate 에 의 해 자동 으로 데이터베이스 에 저 장 됩 니 다.
2、
위 에 user 를 저장 합 니 다. 연 결 된 group hibenate 는 저장 해 줍 니 다. 만약 에 우리 가 group 을 저장 하면 연 결 된 user 가 저장 해 줄 수 있 습 니까?
User u1 = new User();
u1.setName("u1");
User u2 = new User();
u1.setName("u2");
User u3 = new User();
u1.setName("u3");
Group g = new Group();
g.setName("g1");
g.getUsers().add(u1);
g.getUsers().add(u2);
g.getUsers().add(u3);
Session s = sessionFactory.getCurrentSession();
s.beginTransaction();
s.save(g);// ,u1,u2,u3
s.getTransaction.commit();
히 베 네 이 트 가 group 에 저 장 된 관련 대상 을 설정 하려 면 Group 클래스 의 getUsers () 방법 에 대한 설명 @ OneToMany (mappedby = "group") 를 @ OneToMany (mappedby = "group", cascade = (Cascade Type. ALL) 로 변경 해 야 합 니 다.주: 이렇게 만 설정 하면 u1, u2, u3 이 데이터베이스 에 저 장 된 후 group id 는 모두 NULL 입 니 다. u1, u2, u3 대상 의 group 속성 은 null 이기 때문에 코드 블록 에 u1. setGroup (g), u2. setGroup (g), u3. setGroup (g) 을 추가 해 야 합 니 다.
규칙: (1) 다 대 일 관 계 는 여러 측 에서 조작 하 는 것 이 비교적 간단 하 다. (2) 관련 관계 가 양 방향 이면 네 비게 이 션 (mappedBy) 을 잘 설정 해 야 한다. (3) 양 방향 관 계 는 프로그램 에서 양 방향 관 계 를 설정 해 야 한다.
읽다
1. get 방식
데이터베이스 에서 사용자 한 명 을 먼저 나 오 겠 습 니 다.
Session s = sessionFactory.getCurrentSession();
s.beginTransaction();
// cascade Group
User u = (User)s.get(User.class , 1);
s.getTransaction().commit;
저 희 는 데이터베이스 에서 get Group 을 나 옵 니 다. 캐 스 케 이 드 를 설정 하 든 말 든 관련 user 를 꺼 내지 않 습 니 다. 캐 스 케 이 드 는 저장 할 때 만 유효 합 니 다. 읽 기 위해 서 는 따로 설정 해 야 합 니 다.
Group 클래스 의 getUsers () 방법 에 @ OneToMany (mappedBy = "group", cascade = (Cascade Type. ALL) 를 @ OneToMany (mappedby = "group", cascade = (Cascade Type. ALL), fetch = FetchType. EAGER) 로 수정 한 다음 코드 블록 에 쓸 수 있 습 니 다.
Group g = (Group)s.get(Group.class,1);// fetch User
for(User u : g.getUsers()) {
System.out.println(u.getName());
}
User 클래스 에서 getGroup () 방법 에 주석 @ ManyToOne 기본 FetchType 은 EAGER 이기 때 문 입 니 다.
user cascade Group
User 클래스 에서 @ ManyToOne 에 속성 fetch = FetchType. LAZY 를 추가 할 때 user 와 연 결 된 group 을 사용 할 때 만 꺼 냅 니 다.
Session s = sessionFactory.getCurrentSession();
s.beginTransaction();
User u = (User)s.get(User.class , 1);// group
System.out.println(u.getGroup().getName());// group
s.getTransaction().commit;
//System.out.println(u.getGroup().getName()); no session, session 。 EAGER 。
FetchType 은 매 거 진 형식 입 니 다. 다음 과 같 습 니 다.
(1) EAGER: (갈망) 데 이 터 를 열심히 가 져 와 야 한다 고 정의
(2) 레이 지: (게 으 름) 데 이 터 를 게 으 르 게 가 져 올 수 있 음 을 정의 합 니 다.
2. load 방식
업데이트
Session s = sessionFactory.getCurrentSession();
s.beginTransactio();
User u = (User)s.load(User.class , 1);
u.setName("user");
u.getGroup().setName("g");
s.getTransaction().commit();// update
이렇게 쓰 면 되 지만 저 희 는 보통 유리 상태 에 있 는 대상 을 업데이트 합 니 다. user 가 유리 상태 에 있 을 때 session 이 닫 혀 저장 할 수 없습니다.
Session s = sessionFactory.getCurrentSession();
s.beginTransaction();
User u = (User)s.get(User.class,1);
s.getTransaction().commit();
u.setName("user");
u.getGroup().setName("group");
Session s2 = sessionFactory.getCurrentSession();
s2.beginTransaction();
s2.update(u);
// User getGroup() @ManyToOne cascade=CascadeType.ALL , group, update update Group
s2.getTransaction().commit();
삭제
1. 사용자 삭제
Session s = sessionFactory.getCurrentSession();
s.beginTransaction();
User u = (User)s.load(User.class,1);
s.delete(u);
// u , u group user
s.getTransaction().commit();
그룹 을 삭제 하지 않 으 려 면:
u.setGroup(null);
s.delete(u);
HQL 도 사용 가능:
Session s = sessionFactory.getCurrentSession();
s.beginTransaction();
s.createQuery("delete from User u where u.id=1");
s.getTransaction().commit();
2. 그룹 삭제
Session s = sessionFactory.getCurrentSession();
s.beginTransaction();
Group g = (Group)s.load(Group.class,1);
s.delete(g);
// g g user ( cascade=all)
s.getTransaction().commit();
모든 user 를 삭제 하지 않 으 려 면 user 의 group id 를 null 로 설정 할 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.