实际使用中还要注意配置中cascade和inverse的影响,配置不当可能会失败
在本文中主要实现数据的级联插入 下面模拟的场景是 用户有多个订单 在插入用户的时候 将用户的订单添加到订单表中
下面是User 和 Order两个pojo类的代码
[java]
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 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
}
}
[java]
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
耐如或}
}
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 这个就没有什么好说的了
[java]
import hibernate Session
import hibernate Transaction
import 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)
mit()
}
catch(Exception ex)
{
ex printStackTrace()
tx rollback()
}
}
}
import hibernate Session
import hibernate Transaction
import 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)
mit()
}
catch(Exception ex)
{
ex printStackTrace()
tx rollback()
}
}
}
下面的这两个hbm xml文件十分重要
User hbm xml
[]
<?xml version= encoding= UTF ?>
<!DOCTYPE hibernate mapping PUBLIC
//Hibernate/Hibernate Mapping DTD //EN
hiber/hibernate mapping dtd >
<hibernate mapping>
<class name= 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= example domain Order />
</set>
</class>
</hibernate mapping>
<?xml version= encoding= UTF ?>
<!DOCTYPE hibernate mapping PUBLIC
//Hibernate/Hibernate Mapping DTD //EN
hiber/hibernate mapping dtd >
<hibernate mapping>
<class name= 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= 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= encoding= UTF ?>
<!DOCTYPE hibernate mapping PUBLIC
//Hibernate/Hibernate Mapping DTD //EN
hiber/hibernate mapping dtd >
<hibernate mapping>
<class name= 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= example domain User column= whoid ></many to one>
</class>
</hibernate mapping>
<?xml version= encoding= UTF ?>
<!DOCTYPE hibernate mapping PUBLIC
//Hibernate/Hibernate Mapping DTD //EN
hiber/hibernate mapping dtd >
<hibernate mapping>
<class name= 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= example domain User column= whoid ></many to one>
</class>
</hibernate mapping>
其中的 many to one 表示多对一的关系 name表示Order中表示用来关联用户的那个属性的名称 class表示一的那一方的类型 column表示关联关系中用来连接的列 这里仍然是whoid
下面是测试代码
[java]
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 o = new Order()
Order o = new Order()
Order o = new Order()
orders add(o )
orders add(o )
orders add(o )
user setOrders(orders)
Session session = HibernateSessionFactory getSession()
UserDao dao = new UserDao(session)
dao savaUser(user)
}
}
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 o = new Order()
Order o = new Order()
Order o = new Order()
orders add(o )
orders add(o )
orders add(o )
user setOrders(orders)
Session session = HibernateSessionFactory getSession()
UserDao dao = new UserDao(session)
dao savaUser(user)
}
lishixinzhi/Article/program/Java/ky/201311/28639
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)