一对多单向关联 使用一个实例对映多个实例,比如一个学生有很多本书,我们也可以使用多对一来映射,这里介绍一对多的注意事项,在一对多里我们只需要配置的一方,多方通过一方去管理
例如
一方类:
package com.sample.hbm;
import java.util.HashSet;
import java.util.Set;
public class User implements java.io.Serializable{
private String userId;
private String userName;
private String password;
private String sex;
private String age;
private Set books = new HashSet();
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserName() {
System.out.println("**********getUserName***************" + userName);
return userName;
}
public void setUserName(String userName) {
System.out.println("**********setUserName***************" + userName);
this.userName = userName;
}
public String getPassword() {
System.out.println("**********getPassword***************" + password);
return password;
}
public void setPassword(String password) {
System.out.println("**********setPassword***************" + password);
this.password = password;
}
public String getSex() {
System.out.println("**********getSex***************" + sex);
return sex;
}
public void setSex(String sex) {
System.out.println("**********setSex***************" + sex);
this.sex = sex;
}
public String getAge() {
System.out.println("**********getAge***************" + age);
return age;
}
public void setAge(String age) {
System.out.println("**********setAge***************" + age);
this.age = age;
}
public Set getBooks() {
return books;
}
public void setBooks(Set books) {
this.books = books;
}
}
多方类:
package com.sample.hbm;
public class Books {
private String bookId;
private String bookName;
public String getBookId() {
return bookId;
}
public void setBookId(String bookId) {
this.bookId = bookId;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
}
一方配置文件:
<hibernate-mapping>
<class name="com.sample.hbm.User" table="user_table"
schema="public">
<id name="userId" type="string">
<column name="userid" length="32" />
<generator class="uuid.hex" />
</id>
<property name="userName" type="string">
<column name="username" length="32" />
</property>
<property name="password" type="string">
<column name="password" length="16" />
</property>
<property name="sex" type="string">
<column name="user_sex" length="8" />
</property>
<property name="age" type="string">
<column name="user_age" length="8" />
</property>
<set name="books" inverse="false" cascade="save-update">
<key column="user_id" not-null="true"/>
<one-to-many class="com.sample.hbm.Books" />
</set> <!--user_id为books 表的外键 reference 到 user的主键-->
</class>
</hibernate-mapping>
特别注意: <set>元素中的inverse属性,该属性表示关联关系由主控(一方)还是受控方(多方)维护。所谓关联关系的维护就是受控方的外键插入由谁来控制。inverse默认为false,表示由主控方来控制。 插入SQL的语句会分两次进行
Hibernate: insert into public.user_books (book_name, user_id, book_id) values (?, ?, ?)
Hibernate: insert into public.user_books (book_name, user_id, book_id) values (?, ?, ?)
这里插入的user_id 为null 然后在进行更新动作:
Hibernate: update public.user_books set user_id=? where book_id=?
Hibernate: update public.user_books set user_id=? where book_id=?
下面是多方配置文件:
<hibernate-mapping>
<class name="com.sample.hbm.Books" table="user_books"
schema="public">
<id name="bookId" type="string">
<column name="book_id" length="32" />
<generator class="uuid.hex" />
</id>
<property name="bookName" type="string">
<column name="book_name" length="32" />
</property>
</class>
</hibernate-mapping>
部分测试代码:
Books book1 = new Books();
book1.setBookName("JAVA-CN-JL-20080313-B0001");
Books book2 = new Books();
book2.setBookName("JAVA-CN-JL-20080313-B0002");
Set books = new HashSet();
books.add(book1);
books.add(book2);
user.setBooks(books);
userDao.save(user);
以上一对多的配置 通过一方控制多方 通过inverse属性来控制多方
例如
一方类:
package com.sample.hbm;
import java.util.HashSet;
import java.util.Set;
public class User implements java.io.Serializable{
private String userId;
private String userName;
private String password;
private String sex;
private String age;
private Set books = new HashSet();
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserName() {
System.out.println("**********getUserName***************" + userName);
return userName;
}
public void setUserName(String userName) {
System.out.println("**********setUserName***************" + userName);
this.userName = userName;
}
public String getPassword() {
System.out.println("**********getPassword***************" + password);
return password;
}
public void setPassword(String password) {
System.out.println("**********setPassword***************" + password);
this.password = password;
}
public String getSex() {
System.out.println("**********getSex***************" + sex);
return sex;
}
public void setSex(String sex) {
System.out.println("**********setSex***************" + sex);
this.sex = sex;
}
public String getAge() {
System.out.println("**********getAge***************" + age);
return age;
}
public void setAge(String age) {
System.out.println("**********setAge***************" + age);
this.age = age;
}
public Set getBooks() {
return books;
}
public void setBooks(Set books) {
this.books = books;
}
}
多方类:
package com.sample.hbm;
public class Books {
private String bookId;
private String bookName;
public String getBookId() {
return bookId;
}
public void setBookId(String bookId) {
this.bookId = bookId;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
}
一方配置文件:
<hibernate-mapping>
<class name="com.sample.hbm.User" table="user_table"
schema="public">
<id name="userId" type="string">
<column name="userid" length="32" />
<generator class="uuid.hex" />
</id>
<property name="userName" type="string">
<column name="username" length="32" />
</property>
<property name="password" type="string">
<column name="password" length="16" />
</property>
<property name="sex" type="string">
<column name="user_sex" length="8" />
</property>
<property name="age" type="string">
<column name="user_age" length="8" />
</property>
<set name="books" inverse="false" cascade="save-update">
<key column="user_id" not-null="true"/>
<one-to-many class="com.sample.hbm.Books" />
</set> <!--user_id为books 表的外键 reference 到 user的主键-->
</class>
</hibernate-mapping>
特别注意: <set>元素中的inverse属性,该属性表示关联关系由主控(一方)还是受控方(多方)维护。所谓关联关系的维护就是受控方的外键插入由谁来控制。inverse默认为false,表示由主控方来控制。 插入SQL的语句会分两次进行
Hibernate: insert into public.user_books (book_name, user_id, book_id) values (?, ?, ?)
Hibernate: insert into public.user_books (book_name, user_id, book_id) values (?, ?, ?)
这里插入的user_id 为null 然后在进行更新动作:
Hibernate: update public.user_books set user_id=? where book_id=?
Hibernate: update public.user_books set user_id=? where book_id=?
下面是多方配置文件:
<hibernate-mapping>
<class name="com.sample.hbm.Books" table="user_books"
schema="public">
<id name="bookId" type="string">
<column name="book_id" length="32" />
<generator class="uuid.hex" />
</id>
<property name="bookName" type="string">
<column name="book_name" length="32" />
</property>
</class>
</hibernate-mapping>
部分测试代码:
Books book1 = new Books();
book1.setBookName("JAVA-CN-JL-20080313-B0001");
Books book2 = new Books();
book2.setBookName("JAVA-CN-JL-20080313-B0002");
Set books = new HashSet();
books.add(book1);
books.add(book2);
user.setBooks(books);
userDao.save(user);
以上一对多的配置 通过一方控制多方 通过inverse属性来控制多方