2013-02-20 113 views
0

在下面給出的代碼中,cascade =「save-update」用於與Student類關聯的Course類(bag)。級聯不能正常工作休眠

學生類 - >

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

課程班是 - 爲學生>

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

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="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 2013-02-21 09:00:13

+0

http://www.mkyong.com/hibernate/inverse-true-example-and-explanation/ – overmeulen 2013-02-21 09:02:35