ORM 프레임 워크로서 최대 절전 모드는 테이블 간의 연관성을 구현하려면 우리의 요구를 충족시켜야합니다. 연관 방법에서 최대 절전 모드 구현은 매우 간단합니다. 일대일 접근 방식을 살펴 보겠습니다.
더 이상 고민하지 않고 코드를 업로드합시다.
두 개의 엔티티 클래스 인 Tuser와 TPassport :
공개 클래스 턱시기는 시리얼이 가능성 {private static final long serialversionuid = 1L; 개인 int ID; 사적인 int 연령; 개인 문자열 이름; 개인 TPassport 여권; // get/set method를 생략} public class tpassport 구현 시리얼이 가능 {private static final long serialversionuid = 1l; 개인 int ID; 개인 문자열 연쇄; 개인 INT 만료; 비공개 엄부개 사용자; // GET/SET Method를 생략}매핑 파일의 차이점을 살펴 보겠습니다.
<hibernate-mapping package = "org.hibernate.tutorial.domain4"> <class name = "tuser"table = "user4"> <id name = "id"column = "id"> <generator/> </id> <속성 이름 = "name"type = "java.lang.string"column = "name"/> name = "age" "java.rang" 열 = "Age"/> <일대일 이름 = "Passport"Cascade = "All"Outer-Join = "True"/> </class> </Hibernate-Mapping>
여기서 우리는 새로운 레이블 인 일대일 인 일대일이 있습니다.이 레이블은 현재 클래스와 해당 클래스가 일대일이고 캐스케이드는 계단식 관계임을 보여줍니다. 모두 캐스케이드는 어쨌든, 즉 턱시도 클래스에서 작동 할 때, TPassport도 해당 작업을 수행 할 것임을 나타냅니다. 외부 조인은 외부 조인 명령문을 사용할지 여부를 나타냅니다.
다른 tpassport 매핑 파일을 살펴 보겠습니다.
<hibernate-mapping package = "org.hibernate.tutorial.domain4"> <class name = "tpassport"table = "passport"테이블 = "passport4"> <id name = "id"column = "id"> <generator> <propertion "> user </param> </param> </param> </param> </parame" "serial" "java.lang. name = "expiry"type = "java.lang.integer"column = "expiry"/> <일대일 name = "user"ranstained = "true"/> </class> </hibernate-mapping>
여기서 우리는 생성기의 클래스 가치에 중점을 둡니다. 이 외국의 참조 외부 키를 나타내며, 참조는 Param에 의해 지정되며, 이는 참조 사용자 클래스의 ID를 나타냅니다. 일대일 태그에는 추가 제한된 속성이 있는데, 이는 현재 클래스에 외국의 주요 제약이 있음, 즉 현재 클래스의 ID가 니저의 ID를 기반으로 생성된다는 것을 최대 절전 모드에 알려줍니다.
테스트 클래스를 직접 업로드합시다. 이번에는 테스트 클래스가 Junit을 사용하지 않았지만 주요 방법을 직접 제공했습니다.
public static void main (String [] args) {configuration cfg = new configuration (). configure (); SessionFactory SessionFactory = CFG.BuildSessionFactory (); 세션 세션 = sessionfactory.opensession (); session.begintransaction (); Tuser user = new Tuser (); user.setage (20); user.setName ( "shuntest"); tpassport passport = new tpassport (); 여권 .Setexpiry (20); Passport.SetSerial ( "123123123"); Passport.setUser (사용자); user.setpassport (여권); 세션 .SAVE (사용자); session.getTransaction (). commit (); }코드는 매우 간단하므로 이야기하지 않을 것입니다. 주로 여기를 살펴 보겠습니다.
세션 .SAVE (사용자);
왜 우리는 여기서 하나만 저장하는 것만 부르나요? 그 이유는 Tuser 매핑 파일의 캐스케이드 속성이 모든 사람에게 설정되기 때문입니다. 즉, 저장, 업데이트, 삭제 등의 경우 Tuser에서 TPassport도 해당 작업을 수행하므로 세션 (여권)을 작성할 필요가 없습니다. 우리는 배경을 본다 :
최대 절전 모드 : user4 (이름, 연령) 값 (?,?) hibernate에 삽입 : Pashport4에 삽입 (직렬, 만료, id) 값 (?,?,?)Hibernate : 그것은 두 가지 진술을 인쇄하여 최대 절전 모드가 우리를 위해이 일을했음을 증명했습니다.
public static void main (String [] args) {configuration cfg = new configuration (). configure (); SessionFactory SessionFactory = CFG.BuildSessionFactory (); 세션 세션 = sessionfactory.opensession (); Tuser user = (Tuser) Session.load (tuser.class, new Integer (3)); System.out.println (user.getName ()+":"+user.getPassport (). getSerial ()); } 여기서 우리는 Tuser 클래스를 쿼리하고 tpassport 객체를 얻습니다. 외국 키 협회
이제 외국 열쇠를 통해 연관성을 만드는 일대일 협회를 살펴 보겠습니다.
그것은 여전히 예와 동일합니다.
공개 클래스 tgroup은 직렬화 가능한 {private static final long serialversionuid = 1L; 개인 int ID; 개인 문자열 이름; 비공개 엄부개 사용자; // get/set method를 생략} 공개 클래스 턱시기 시리얼이즈 가능 {private static final long serialversionuid = 1l; 개인 int ID; 사적인 int 연령; 개인 문자열 이름; 개인 TGROUP 그룹; // GET/SET Method를 생략} 엔티티 클래스가 완료되면 매핑 파일을 살펴 보겠습니다.
<hibernate-mapping package = "org.hibernate.tutorial.domain5"> <class name = "tuser"table = "user5"> <id name = "id"column = "id"> <generator/> </id> <property name = "name"type = "java.lang.string"column = "name"= "age" "java. 열 = "age"/> <다중 하나 이름 = "그룹"열 = "group_id"고유 = "true"/> </class> </hibernate-mapping>
여기서 우리는 일대일 대신 다중 태그가 사용됨을 알 수 있습니다. 왜?
전에 사용했을 때 나는 그것에 많은 관심을 기울이지 않았습니다. 어쨌든, 나는 그것을 사용하면됩니다. 그러나 이번에는 Xia Xin의 저서를 읽은 후에, 나는 실제로 외국 열쇠를 통한이 연관성이 다수의 특별한 방법이라는 것을 알았습니다. 우리는 하나의 단 하나, 즉 일대일 상관 관계가 있어야한다는 고유 = "true"를 통해 제한했습니다.
다음으로 tgroup의 매핑 파일을 살펴 보겠습니다.
<hibernate-mapping package = "org.hibernate.tutorial.domain5"> <class name = "tgroup"table = "group5"> <id name = "id"column = "id"> <generator/> </id> <속성 이름 = "name"type = "java.lang.string"column = "name"/> <user-ref "" "> </hibernate-mapping>
여기서는 일대일로 다시 사용하여 현재 엔티티와 니저가 일대일임을 나타냅니다. 여기서는 다중 하나를 사용하지 않지만 현재 클래스 TGroup을 연결하기 위해 턱시체 엔티티의 어떤 속성을 지정합니다. 여기서 우리는 Tuser가 그룹 속성을 통해 Tuser와 관련이 있음을 지정합니다. Property-Ref는 연관 할 속성을 지정합니다.
아래 테스트 클래스를 살펴 보겠습니다.
public class hibernateTest {public static void main (String [] args) {configuration cfg = new configuration (). configure (); SessionFactory SessionFactory = CFG.BuildSessionFactory (); 세션 세션 = sessionfactory.opensession (); session.begintransaction (); tgroup group = new tgroup (); Group.setName ( "TestGroup"); Tuser user = new Tuser (); user.setage (23); user.setName ( "테스트"); user.setGroup (그룹); Group.setUser (사용자); 세션 .save (그룹); 세션 .SAVE (사용자); session.getTransaction (). commit (); session.close (); }} 우리의 코드는 서로에 대한 해당 서신이 있기 때문에 이번에는 두 번 저장해야합니다. 하나만 저장해도 다른 작업을 유발하지 않습니다. 따라서 저장된 작업을 두 번 호출해야합니다. 마지막으로 제출하십시오.
최대 절전 모드 진술을 인쇄합니다.
Hibernate : Group5 (이름) 값에 삽입 (?) Hibernate : user5 (이름, Age, Group_id) 값 (?,?,?)에 삽입하십시오.
이것은 우리가 두 객체 값을 올바르게 저장했음을 의미합니다.
쿼리에 추가 테스트 클래스를 작성합니다.
public static void main (String [] args) {configuration cfg = new configuration (). configure (); SessionFactory SessionFactory = CFG.BuildSessionFactory (); 세션 세션 = sessionfactory.opensession (); Tuser user = (Tuser) Session.load (tuser.class, new Integer (1)); System.out.println ( "사용자 get 그룹에서 :"+user.getgroup (). getName ()); tgroup group = (tgroup) session.load (tgroup.class, new Integer (1)); System.out.println ( "Group from Group Get user :" + group.getUser (). getName ()); session.close (); } 우리는 올바른 결과를 얻을 수 있으며, 이는 두 객체를 통해 상대방의 값을 꺼내서 목표를 달성 할 수 있음을 보여줍니다.
이 예제에 사용 된 Tgroup 및 니저는 예제 일뿐입니다. 실제로, 실생활의 사용자는 일반적으로 여러 그룹에 해당합니다.