Hibernate 는 one - to - many 에서 부자 관계 의 자동 삽입 을 실현 합 니 다.

이것 은 오래된 성장 담 문제 이다. Hibernate 를 공부 할 때 그 당시 에는 영원히 사용 할 수 없다 고 생각 했다. 왜냐하면 현재 데이터 베이스 디자인 은 범례 에 따라 엄격하게 디자인 되 지 않 았 고 논리 적 인 외부 키 관 계 를 사용 하여 코드 에서 이런 업무 논 리 를 통제 할 때 가 많 기 때문이다.하지만 이번 에는 '관광지 + 티켓' 의 1 - N 관계 모델 에서 제품 이 관광지 정 보 를 삽입 할 때 N 개의 티켓 유형 정 보 를 입력 하도록 설계 했다.따라서 개인 적 으로 삽입 (CMS 에서 데 이 터 를 입력 할 때) 에 사용 할 때 이러한 연결 을 추가 하고 삭제 하 는 것 이 비교적 편리 하 다 고 생각 합 니 다. 삽입 은 커 다란 데이터 베이스 압력 을 가 져 오지 않 기 때 문 입 니 다 (hibernate 의 이러한 연결 작업 은 확실히 효율 이 높 지 않 습 니 다. 인쇄 된 HQL 에서 볼 수 있 듯 이 Hibernate 는 N 의 한 끝 에 도 삽입 되 어 있 습 니 다).
      주의: 데이터베이스 시트 를 디자인 할 때 서브 시트 에 물리 적 외 키 관련 부모 표를 설정 하 는 것 은 필수 적 인 것 이 아니 라 현재 의 데이터 베이스 디자인 은 논리 적 외 키 관계 에 편중 되 어 후기 작업 에 큰 편 의 를 가 져 다 줄 수 있 습 니 다.
 
관광지 와 입장권 유형의 POJO 와 hbm 코드
관광지 POJO
public class TbScenery {
	private String id;
	private String jdname;
	
	private List<TbSceneryTickets> tbSceneryTickets;
	//getter setter....
}

관광지 hbm
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping>
    <class name="TbScenery" table="TB_SCENERY">
        <id name="id" type="java.lang.String">
            <column name="ID" length="32" />
            <generator class="sequence" >  
    			<param name="sequence">SEQ_SCENERY</param>  
    		</generator>
        </id>
        <property name="jdname" type="java.lang.String">
            <column name="JDNAME" length="500" />
        </property>
	<!--     Parent    inverse="true" cascade="all"-->
	<list name="tbSceneryTickets" lazy="false" inverse="true" cascade="all">
		<key><column name="SCENERY_ID" /></key>
		<index column="ID" type="java.lang.String" />
		<one-to-many class="TbSceneryTickets" />
	</list>
    </class>
</hibernate-mapping>

 
입장권 POJO:
public class TbSceneryTickets implements java.io.Serializable {
	private String id;
	private String sceneryId;//  
	private String typeName;
	//getter setter....
}

입장권
<hibernate-mapping>
	<class name="TbSceneryTickets" table="TB_SCENERY_TICKETS" lazy="false">	
        <id name="id" type="java.lang.String">
            <column name="ID" length="32" />
            <generator class="sequence" >  
    			<param name="sequence">SEQ_SCENERY_TICKET</param>  
    		</generator>
        </id>
		
		<property name="sceneryId" type="java.lang.String" column="SCENERY_ID"
			length="32" />
		<property name="typeName" type="java.lang.String" column="TYPE_NAME"
			length="100" />
	</class>
</hibernate-mapping>

 
테스트 후 업 데 이 트 를 하고 작업 을 삭제 할 때 아무런 문제 가 없 음 을 발 견 했 습 니 다. 다음 과 같은 삽입 작업 을 할 때 삽입 에 실패 한 것 을 발견 할 수 있 습 니 다.
public void test() {
	TbScenery scenery = new TbScenery();
	scenery.setJdname("    ");
	
	//       id          id            ,         。
	//               sceneryId  
	TbSceneryTickets ticket1 = new TbSceneryTickets();
	ticket1.setTypeName("   ");
	
	TbSceneryTickets ticket2 = new TbSceneryTickets();
	ticket1.setTypeName("   ");
	
	List<TbSceneryTickets> tbSceneryTickets = new ArrayList<TbSceneryTickets>();
	tbSceneryTickets.add(ticket1);
	tbSceneryTickets.add(ticket2);
	scenery.setTbSceneryTickets(tbSceneryTickets);
	
	dao.saveOrUpdate(scenery);
}
 
      이 유 는 '관광지' 를 새로 만 들 고 '티켓 유형' 이 n 개 있 을 때 '관광지' 대상 을 한꺼번에 제출 할 수 없습니다. tbScenery Tickets 가 scenary 에 값 을 부여 하기 전에 먼저 scenary 를 저장 해 야 합 니 다. scenary 는 new 가 나 온 대상 이기 때문에 오래 지속 되 는 대상 이 아니 라 tbScenery Tickets 에 값 을 부여 해 야 합 니 다.Hibernate 는 상 태 를 검사 할 수 없습니다.사실 쉽게 말 하면 scenery (관광지 대상) 자신 에 게 id 표지 가 없다 는 것 이다. 그러면 모든 TbScenery Tickets 대상 (입장권 유형 대상) 은 외부 키 가 무엇 인지 어떻게 알 수 있 습 니까?
     one - to - many 에 대해 서 는 일반적으로 다음 과 같은 조작 을 합 니 다.
public void test() {
	TbScenery scenery = new TbScenery();
	scenery.setJdname("    ");
	
	//       ,scenery        ,  debug         
	dao.saveOrUpdate(scenery);
	
	TbSceneryTickets ticket1 = new TbSceneryTickets();
	ticket1.setTypeName("   ");
	//       ,       ticket   
	ticket1.setSceneryId(scenery.getId());
	
	TbSceneryTickets ticket2 = new TbSceneryTickets();
	ticket1.setTypeName("   ");
	ticket2.setSceneryId(scenery.getId())
	
	List<TbSceneryTickets> tbSceneryTickets = new ArrayList<TbSceneryTickets>();
	tbSceneryTickets.add(ticket1);
	tbSceneryTickets.add(ticket2);
	scenery.setTbSceneryTickets(tbSceneryTickets);
	
	dao.saveOrUpdate(scenery);
}

 
프로젝트 에서 이 원 리 를 사용 하여 원 - to - many 의 직렬 연결 작업 을 쉽게 완성 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기