在上一篇文檔中,主要講了如何在myeclipse中部署一個Hibernate項目,在本文中主要實現數據的級聯插入,下面模擬的場景是,用戶有多個訂單,在插入用戶的時候,將用戶的訂單添加到訂單表中。
下面是User 和 Order兩個pojo類的代碼
public class Order {
private int id;
private int whoid; // thi id of the order's User
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getWhoid() {
return whoid;
}
public void setWhoid(int whoid) {
this.whoid = whoid;
}
}
public class User {
private int id;
private String username;
private String password;
//這裏需要注意的是使用集合必須使用Set,而不能用HashSet,否者在插入數據的時候會拋出一個參數不匹配異常
private Set<Order> orders;
public Set<Order> getOrders() {
return orders;
}
public void setOrders(Set<Order> orders) {
this.orders = orders;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
下面這個是UserDao,這個就沒有什麼好說的了
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.example.domain.User;
public class UserDao {
private Session session;
public UserDao(Session session )
{
this.session = session;
}
public void savaUser(User user)
{
Transaction tx = session.beginTransaction();
try
{
session.save(user);
tx.commit();
}
catch(Exception ex)
{
ex.printStackTrace();
tx.rollback();
}
}
}
下面的這兩個hbm.xml文件十分重要
User.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.example.domain.User" table="user" >
<id name="id" column="id" type="java.lang.Integer">
<generator class="increment"></generator>
</id>
<property name="username" column="username" type="java.lang.String"></property>
<property name="password" column="password" type="java.lang.String"></property>
<set name="orders" cascade="save-update" inverse="false" >
<key column="whoid"></key>
<one-to-many class="com.example.domain.Order"/>
</set>
</class>
</hibernate-mapping>
其中要理解的就是set這個標籤,這個標籤對應了User對象中的集合對象,name依然是User中屬性的名字,inserse爲false表示了這種一對多的關係由User來維護,默認值就是false,那麼那一方就有責任負責之間的關聯關係,說白了就是hibernate如何生成Sql來維護關聯的記錄,比如說當User的狀態發生了改變,這種改變會延伸到每一個關聯到這個User的Order上。
key標籤用來表明,這兩個關係是通過那個屬性來連接的,那麼Order表中的外鍵是whoid,那麼這兩個關係是通過whoid來維護的。one-to-many表示一對多的關係,其中class表示Set集合中的對象類型,也可以這麼理解,即一對多的關係,多的一方的類型是什麼。
Order.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.example.domain.Order" table="Orders">
<id name="id" column="id" type="java.lang.Integer">
<generator class="increment"></generator>
</id>
<many-to-one name="user" class="com.example.domain.User" column="whoid"></many-to-one>
</class>
</hibernate-mapping>
其中的 many-to-one,表示多對一的關係,name表示Order中表示用來關聯用戶的那個屬性的名稱,class表示一的那一方的類型,column表示關聯關係中用來連接的列,這裏仍然是whoid。
下面是測試代碼
public class Test {
public static void main(String args[])
{
User user = new User();
user.setUsername("Neway");
user.setPassword("admin");
HashSet<Order> orders = new HashSet<Order>();
Order o1 = new Order();
Order o2 = new Order();
Order o3 = new Order();
orders.add(o1);
orders.add(o2);
orders.add(o3);
user.setOrders(orders);
Session session = HibernateSessionFactory.getSession();
UserDao dao = new UserDao(session);
dao.savaUser(user);
}
}