2013-02-20 4 views
0

아래 주어진 코드에서 cascade = "save-update"는 Student 클래스와 연결된 Course 클래스 (bag)에 사용됩니다. 학생을위한>캐스케이드가 최대 절전 모드에서 올바르게 작동하지 않습니다.

private int id; 
    private String name; 
    private int unit; 

HBM 파일입니다 - ->

private int id; 
    private String firstName; 
    private String lastName; 
    private Address address; 
    private List<Course> courses; 

코스 클래스입니다 -이

학생 클래스는 내가 수행하고있어>

<?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="pojos.Student" table="Student"> 

     <id name="id" type="integer" column="ID"> 
      <generator class="increment" /> 
     </id> 

     <property name="firstName"> 
      <column name="FIRST_NAME" /> 
     </property> 

     <property name="lastName"> 
      <column name="LAST_NAME" /> 
     </property> 

     <many-to-one name="address" 
        class="pojos.Address" 
        column="ADDRESS_ID" 
        cascade="save-update" /> 

     <bag name="courses" inverse="true" cascade="save-update"> 
      <key column="STUDENT_ID" /> 
      <one-to-many class="pojos.Course" /> 
     </bag> 

    </class> 
</hibernate-mapping> 

거래 간단합니다 ->

    Student stud = new Student("Ketan", "Dikshit"); 
      Address address = new Address("Dm-Road", "Uttar Pradesh", "201301"); 
      Course course1 = new Course("Core Java", 101); 
      Course course2 = new Course("Advanced Java", 201); 

      List<Course> courses = new ArrayList<Course>(); 
      courses.add(course1); 
      courses.add(course2); 

      stud.setAddress(address); 
      stud.setCourses(courses); 

      try { 
       tr = session.beginTransaction(); 
       System.out.println("\n Transaction has begun..!!"); 
       session.save(stud); 
       tr.commit(); 
       System.out.println("\n Transaction is Commit..!!"); 
       session.close(); 
       System.out.println("\n Session is Closed..!!"); 

      } catch (Exception e) { 
       System.out.println("\n Transaction is in errror..!!"); 
       tr.rollback(); 
       System.out.println("\n Transaction is RollBack..!!"); 
       session.close(); 
       System.out.println("\n Session is Closed..!!"); 
      } 

이제 코드에 따라 코스 테이블에는 코스 테이블의 각 항목에 대해 연결된 학생의 기본 키가있는 'STUDENT_ID'라는 열이 있어야합니다. 그러나 'STUDENT_ID'열에는 데이터가 표시되지 않습니다. (모든 널값이 삽입 됨).

쿼리 순서입니다 ->

Transaction has begun..!! 
Hibernate: select max(ID) from Student 
Hibernate: select max(ID) from Address 
Hibernate: select max(ID) from Course 
Hibernate: insert into Address (STREET, CITY, ZIPCODE, ID) values (?, ?, ?, ?) 
Hibernate: insert into Student (FIRST_NAME, LAST_NAME, ADDRESS_ID, ID) values (?, ?, ?, ?) 
Hibernate: insert into Course (NAME, UNIT, ID) values (?, ?, ?) 
Hibernate: insert into Course (NAME, UNIT, ID) values (?, ?, ?) 

Transaction is Commit..!! 

왜 코스 테이블의 열이 NULL 값을 보여주는 대신 학생의 ID 년대를 들고 ??

답변

1

가방 매핑에서 inverse="true"을 삭제하십시오. 그렇지 않으면이 관계의 소유자는 학생이 아닌 과목이됩니다.

+0

그래도이 용어가 inverse = "true"라는 말을들을 때마다, 나는 종종 자신을 잘못 판단합니다. 이유는 무엇인지 그리고 왜 이렇게 명확하게 이해할 수 없었는 지요. 속성이 작동하면, 일대 다 관계가있을 때 항상 '많은'선언에 들어가야한다는 것을 알고 있습니다. 가능하다면 저를 도와주십시오 (일부 링크 또는 명확한 설명이 도움이 될 수 있음). – KDjava

+0

http://www.mkyong.com/hibernate/inverse-true-example-and-explanation/ – overmeulen