hibernate 一对多双向级联 级联更新的问题 本帖最后由 luallen 于 2011-02-16 13:17:16 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 set注入必须要有属性的get/set方法。 你把每个类的属性都设好set/get。 而且你好象没配置 你的级联关系由谁管理:inverse="true",一般这个配置是放在一的一端。package com.entity;import java.util.HashSet;import java.util.Set;/** * SysRole entity. * * @author MyEclipse Persistence Tools */public class SysRole implements java.io.Serializable { // Fields private String roleName; private String roleDesc; private Long roleFlag; private Set<Users> users = new HashSet<Users>(); private Set<SysRoleRight> roleR = new HashSet<SysRoleRight>(); // Constructors public Set<SysRoleRight> getRoleR() { return roleR; } public void setRoleR(Set<SysRoleRight> roleR) { this.roleR = roleR; } public Set<Users> getUsers() { return users; } public void setUsers(Set<Users> users) { this.users = users; } /** default constructor */ public SysRole() { } /** minimal constructor */ public SysRole(String roleName) { this.roleName = roleName; } /** full constructor */ public SysRole(String roleName, String roleDesc, Long roleFlag) { this.roleName = roleName; this.roleDesc = roleDesc; this.roleFlag = roleFlag; } // Property accessors public String getRoleName() { return this.roleName; } public void setRoleName(String roleName) { this.roleName = roleName; } public String getRoleDesc() { return this.roleDesc; } public void setRoleDesc(String roleDesc) { this.roleDesc = roleDesc; } public Long getRoleFlag() { return this.roleFlag; } public void setRoleFlag(Long roleFlag) { this.roleFlag = roleFlag; }}package com.entity;/** * Users entity. * * @author MyEclipse Persistence Tools */public class Users implements java.io.Serializable { // Fields private String UId; private String UName; private String UTrueName; private String UPassword; private SysRole role ; private Long UFlag; // Constructors /** default constructor */ public Users() { } // Property accessors public String getUId() { return this.UId; } public void setUId(String UId) { this.UId = UId; } public String getUName() { return this.UName; } public void setUName(String UName) { this.UName = UName; } public String getUTrueName() { return this.UTrueName; } public void setUTrueName(String UTrueName) { this.UTrueName = UTrueName; } public String getUPassword() { return this.UPassword; } public void setUPassword(String UPassword) { this.UPassword = UPassword; } public SysRole getRole() { return role; } public void setRole(SysRole role) { this.role = role; } public Long getUFlag() { return this.UFlag; } public void setUFlag(Long UFlag) { this.UFlag = UFlag; }}<?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"><!-- Mapping file autogenerated by MyEclipse Persistence Tools--><hibernate-mapping> <class name="com.entity.SysRole" table="SYS_ROLE" schema="ACCP"> <id name="roleName" type="java.lang.String"> <column name="ROLE_NAME" length="50" /> <generator class="assigned" /> </id> <property name="roleDesc" type="java.lang.String"> <column name="ROLE_DESC" length="50" /> </property> <property name="roleFlag" type="java.lang.Long"> <column name="ROLE_FLAG" precision="22" scale="0" /> </property> <!-- 配置用户和角色之间的关系 --> <set name="users" table="users" cascade="save-update" lazy="false" inverse="true"> <key column="U_ROLE_NAME"></key> <one-to-many class="com.entity.Users"/> </set> <set name="roleR" table="sys_role_right" cascade="save-update" inverse="false" lazy="false"> <key column="rf_role_name"></key> <one-to-many class="com.entity.SysRoleRight"/> </set> </class></hibernate-mapping><?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"><!-- Mapping file autogenerated by MyEclipse Persistence Tools--><hibernate-mapping> <class name="com.entity.Users" table="USERS" schema="ACCP"> <id name="UId" type="java.lang.String"> <column name="U_ID" length="32" /> <generator class="assigned" /> </id> <property name="UName" type="java.lang.String"> <column name="U_NAME" length="60" not-null="true" /> </property> <property name="UTrueName" type="java.lang.String"> <column name="U_TRUE_NAME" length="60" not-null="true" /> </property> <property name="UPassword" type="java.lang.String"> <column name="U_PASSWORD" length="60" not-null="true" /> </property> <!-- 配置用户和角色之间的关系 --> <many-to-one name="role" class="com.entity.SysRole"> <column name="U_ROLE_NAME" precision="22" scale="0" not-null="true" /> </many-to-one> <property name="UFlag" type="java.lang.Long"> <column name="U_FLAG" precision="22" scale="0" /> </property> </class></hibernate-mapping> set get 没有错误public List<SalesOrderProductModel> getSalesorderproducts() { return salesorderproducts; } public void setSalesorderproducts(List<SalesOrderProductModel> salesorderproducts) { this.salesorderproducts = salesorderproducts; }加上那个inverse="true",也白搭啊 public String update() { dao.update(salesorder); return SUCCESS; }在action里面直接执行的dao中的 update方法,dao这么写的public void update(SalesOrderModel salesorder) { Session session = HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession(); session.update(salesorder); }事务控制都是struts2 拦截器 自己开启及关闭 双向关联必须只明确 哪一方为维护端 哪一方为被维护端 ,只有维护段才拥有维护的权利 ,被维护端是没有权利去 更新 维护的 否则会出现错误提示信息或者无法导致 更新 ,还望搂着 查阅 hibernate 当中的inverse property 瞅瞅 希望对楼主有用 删除父类时、必须解除从类的关联关系,否则会报错,如下:1没设置级联删除时,要先删除订单详细,再删除订单 2若设置级联删除,则可直接删除订单,此时会自动删除订单详细 3设不设级联删除,要具体情况具体分析举个例: public void dellOrder(int oid){ Transaction tx=null; session=this.getSession(); Order o=(Order) session.get(Order.class, oid);//Order一个一方 try { tx=session.beginTransaction(); Iterator it=o.getItems().iterator(); while (it.hasNext()) { OrderItem i=(OrderItem)it.next();//OrderItem 多的一方 session.delete(i); } session.delete(o); tx.commit(); } catch (HibernateException e) { if(tx!=null){ tx.rollback(); } e.printStackTrace(); }finally{ this.closeSession(); } } 希望对你有用、如果觉得还可惜请你给点分、谢谢! JSP纠结问题,高手指点呀! 网站支持多语言? 有状态的会话 bean的 remove问题。 关于xml校验的问题:dtd?schema? Hibernate一对多 inverse="false"插入多条数据只有最后一条有外键 帮忙看一下关于Struts里的fileupload功能 求代码,我需要实现基于http协议的socket编程 关于Jsp和tomcat的问题,高手们帮忙看看吧! 大家当我看看那点有错阿 各位高手,过来帮帮,十万火急!!!!!! SSH中,action引用service时,是定义具体的还是抽象的? 关于qq,淘宝大数据量的存贮和查询
你把每个类的属性都设好set/get。 而且你好象没配置 你的级联关系由谁管理:inverse="true",一般这个配置是放在一的一端。package com.entity;import java.util.HashSet;
import java.util.Set;/**
* SysRole entity.
*
* @author MyEclipse Persistence Tools
*/public class SysRole implements java.io.Serializable { // Fields private String roleName;
private String roleDesc;
private Long roleFlag;
private Set<Users> users = new HashSet<Users>();
private Set<SysRoleRight> roleR = new HashSet<SysRoleRight>();
// Constructors public Set<SysRoleRight> getRoleR() {
return roleR;
} public void setRoleR(Set<SysRoleRight> roleR) {
this.roleR = roleR;
} public Set<Users> getUsers() {
return users;
} public void setUsers(Set<Users> users) {
this.users = users;
} /** default constructor */
public SysRole() {
} /** minimal constructor */
public SysRole(String roleName) {
this.roleName = roleName;
} /** full constructor */
public SysRole(String roleName, String roleDesc, Long roleFlag) {
this.roleName = roleName;
this.roleDesc = roleDesc;
this.roleFlag = roleFlag;
} // Property accessors public String getRoleName() {
return this.roleName;
} public void setRoleName(String roleName) {
this.roleName = roleName;
} public String getRoleDesc() {
return this.roleDesc;
} public void setRoleDesc(String roleDesc) {
this.roleDesc = roleDesc;
} public Long getRoleFlag() {
return this.roleFlag;
} public void setRoleFlag(Long roleFlag) {
this.roleFlag = roleFlag;
}}package com.entity;/**
* Users entity.
*
* @author MyEclipse Persistence Tools
*/public class Users implements java.io.Serializable { // Fields private String UId;
private String UName;
private String UTrueName;
private String UPassword;
private SysRole role ;
private Long UFlag; // Constructors /** default constructor */
public Users() {
} // Property accessors public String getUId() {
return this.UId;
} public void setUId(String UId) {
this.UId = UId;
} public String getUName() {
return this.UName;
} public void setUName(String UName) {
this.UName = UName;
} public String getUTrueName() {
return this.UTrueName;
} public void setUTrueName(String UTrueName) {
this.UTrueName = UTrueName;
} public String getUPassword() {
return this.UPassword;
} public void setUPassword(String UPassword) {
this.UPassword = UPassword;
} public SysRole getRole() {
return role;
} public void setRole(SysRole role) {
this.role = role;
} public Long getUFlag() {
return this.UFlag;
} public void setUFlag(Long UFlag) {
this.UFlag = UFlag;
}
}<?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">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="com.entity.SysRole" table="SYS_ROLE" schema="ACCP">
<id name="roleName" type="java.lang.String">
<column name="ROLE_NAME" length="50" />
<generator class="assigned" />
</id>
<property name="roleDesc" type="java.lang.String">
<column name="ROLE_DESC" length="50" />
</property>
<property name="roleFlag" type="java.lang.Long">
<column name="ROLE_FLAG" precision="22" scale="0" />
</property>
<!-- 配置用户和角色之间的关系 -->
<set name="users" table="users" cascade="save-update" lazy="false" inverse="true">
<key column="U_ROLE_NAME"></key>
<one-to-many class="com.entity.Users"/>
</set>
<set name="roleR" table="sys_role_right" cascade="save-update" inverse="false" lazy="false">
<key column="rf_role_name"></key>
<one-to-many class="com.entity.SysRoleRight"/>
</set>
</class>
</hibernate-mapping>
<?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">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="com.entity.Users" table="USERS" schema="ACCP">
<id name="UId" type="java.lang.String">
<column name="U_ID" length="32" />
<generator class="assigned" />
</id>
<property name="UName" type="java.lang.String">
<column name="U_NAME" length="60" not-null="true" />
</property>
<property name="UTrueName" type="java.lang.String">
<column name="U_TRUE_NAME" length="60" not-null="true" />
</property>
<property name="UPassword" type="java.lang.String">
<column name="U_PASSWORD" length="60" not-null="true" />
</property>
<!-- 配置用户和角色之间的关系 -->
<many-to-one name="role" class="com.entity.SysRole">
<column name="U_ROLE_NAME" precision="22" scale="0" not-null="true" />
</many-to-one>
<property name="UFlag" type="java.lang.Long">
<column name="U_FLAG" precision="22" scale="0" />
</property>
</class>
</hibernate-mapping>
set get 没有错误public List<SalesOrderProductModel> getSalesorderproducts()
{
return salesorderproducts;
} public void setSalesorderproducts(List<SalesOrderProductModel> salesorderproducts)
{
this.salesorderproducts = salesorderproducts;
}
加上那个inverse="true",也白搭啊
{
dao.update(salesorder);
return SUCCESS;
}在action里面直接执行的dao中的 update方法,dao这么写的public void update(SalesOrderModel salesorder)
{
Session session = HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();
session.update(salesorder);
}事务控制都是struts2 拦截器 自己开启及关闭
双向关联必须只明确 哪一方为维护端 哪一方为被维护端 ,只有维护段才拥有维护的权利 ,被维护端是没有权利去 更新 维护的 否则会出现错误提示信息或者无法导致 更新 ,还望搂着 查阅 hibernate 当中的
inverse property 瞅瞅 希望对楼主有用
如下:1没设置级联删除时,要先删除订单详细,再删除订单
2若设置级联删除,则可直接删除订单,此时会自动删除订单详细
3设不设级联删除,要具体情况具体分析
举个例: public void dellOrder(int oid){
Transaction tx=null;
session=this.getSession();
Order o=(Order) session.get(Order.class, oid);//Order一个一方 try {
tx=session.beginTransaction();
Iterator it=o.getItems().iterator();
while (it.hasNext())
{
OrderItem i=(OrderItem)it.next();//OrderItem 多的一方 session.delete(i);
}
session.delete(o);
tx.commit();
} catch (HibernateException e) {
if(tx!=null){
tx.rollback();
}
e.printStackTrace();
}finally{
this.closeSession();
}
}
希望对你有用、如果觉得还可惜请你给点分、谢谢!