import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.Test;import com.ifacewall.model.UserGradeBean;
import com.ifacewall.model.UserInfoBean;public class UserInfoServiceTest { private static final SessionFactory sesstionFactory = (new Configuration()
.configure().buildSessionFactory()); public interface IUserinfo {
void saveUserGrade(Session session, UserInfoBean userbean); void getUserLit(Session session);
}
@SuppressWarnings("unchecked")
@Test
public void HookFnk() {
// 模仿的是钩子函数
transctionTemplemnt(new IUserinfo() {
// manyt-to-one保存
public void saveUserGrade(Session session, UserInfoBean userbean) { if(1==1)return;
// TODO Auto-generated method stub
UserGradeBean userGradeBean = new UserGradeBean(); userGradeBean.setCreateTime(java.util.Calendar.getInstance()
.getTime());
userGradeBean.setGradeName("2班"); // cascade:all,级联,如果userinfo加了那么就可以不先保存
// session.save(userGradeBean); System.out.println("-----------" + userGradeBean.getId()); userbean = new UserInfoBean(); userbean.setUserGradeBean(userGradeBean);
userbean.setBirthDate(java.util.Calendar.getInstance()
.getTime());
userbean.setUserName("Gt." + System.currentTimeMillis()); session.save(userbean); } //就这里为什么报错了
public void getUserLit(Session session) {
// TODO Auto-generated method stub UserInfoBean userInfoBean = null;
Set students = new HashSet();
UserGradeBean userGradeBean = new UserGradeBean();
userGradeBean.setGradeName("grad:" + System.currentTimeMillis());
userGradeBean.setCreateTime(java.util.Calendar.getInstance().getTime()); userInfoBean = new UserInfoBean(); userInfoBean.setBirthDate(java.util.Calendar.getInstance().getTime());
userInfoBean.setUserName("XXXX");
userInfoBean.setUserGradeBean(userGradeBean);
students.add(userInfoBean);
userInfoBean = new UserInfoBean(); userInfoBean.setBirthDate(java.util.Calendar.getInstance().getTime());
userInfoBean.setUserName("XXXX");
userInfoBean.setUserGradeBean(userGradeBean);
students.add(userInfoBean);
userInfoBean = new UserInfoBean(); userInfoBean.setBirthDate(java.util.Calendar.getInstance().getTime());
userInfoBean.setUserName("XXXX");
userInfoBean.setUserGradeBean(userGradeBean);
students.add(userInfoBean);
userGradeBean.setUserInfoList(students);
session.save(userGradeBean);
//上面我出现了2个问题,一个是报错,另外一个是:userinfo没有insert语句?
} });
} /*-----------------------------------------------------------------------------*/
private void transctionTemplemnt(IUserinfo iinfo) { System.out.println(sesstionFactory == null ? "null" : "");
Session session = sesstionFactory.openSession();
session.beginTransaction(); iinfo.saveUserGrade(session, null); iinfo.getUserLit(session); session.getTransaction().commit(); session.close();
}}
---------------------------
<?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 package="com.ifacewall.model">
<class name="UserGradeBean" table="usergrad" >
<id
name="id"
column="gids"
unsaved-value="null"
>
<generator class="sequence">
<param name="sequence">usergrad_sequence</param>//这里是oracle的sequence
</generator>
</id>
<property name="gradeName" >
<column name="gname" length="20" />
</property>
<property name="createTime" type="java.util.Date">
<column name="gcreattime" ></column>
</property>
<set name="UserInfoList" cascade="save-update">
<key column="gid"></key>
<one-to-many class="UserInfoBean"/>
</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">
<hibernate-mapping package="com.ifacewall.model">
<class name="UserInfoBean" table="userinfo" >
<id
name="id"
column="id"
type="java.lang.Long"
unsaved-value="null"
>
<generator class="sequence">
<param name="sequence">userinfo_sequence</param>
</generator>
</id>
<property name="userName" type="java.lang.String">
<column name="userName" length="20" />
</property>
<property name="birthDate" type="java.util.Date">
<column name="birthDate" ></column>
</property>
<!-- 默认是懒加载,懒加载:只有去执行获取对象的时候才执行sql,非懒加载:执行的时候直接获取获取
<many-to-one name="userGradeBean" column="gid" cascade="all" lazy="false">
-->
<many-to-one name="userGradeBean" column="gid" cascade="all" >
</many-to-one>
</class>
</hibernate-mapping>
-----------------------------
public class UserGradeBean { private java.lang.Integer id;
private String gradeName;
private Date createTime;
private Set userInfoList = new HashSet();
}
--------------------------------------------------
public class UserInfoBean {
private long id;
private String userName;
private Date birthDate;
private UserGradeBean userGradeBean;
}
------------------------
create sequence userinfo_sequence--另外一个改这个名字usergrad_sequence
minvalue 1
maxvalue 99999999999999999
increment by 1
nocache
;
----------------------------------
Error:org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.ifacewall.model.UserInfoBean#0]
import java.util.Iterator;
import java.util.List;
import java.util.Set;import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.Test;import com.ifacewall.model.UserGradeBean;
import com.ifacewall.model.UserInfoBean;public class UserInfoServiceTest { private static final SessionFactory sesstionFactory = (new Configuration()
.configure().buildSessionFactory()); public interface IUserinfo {
void saveUserGrade(Session session, UserInfoBean userbean); void getUserLit(Session session);
}
@SuppressWarnings("unchecked")
@Test
public void HookFnk() {
// 模仿的是钩子函数
transctionTemplemnt(new IUserinfo() {
// manyt-to-one保存
public void saveUserGrade(Session session, UserInfoBean userbean) { if(1==1)return;
// TODO Auto-generated method stub
UserGradeBean userGradeBean = new UserGradeBean(); userGradeBean.setCreateTime(java.util.Calendar.getInstance()
.getTime());
userGradeBean.setGradeName("2班"); // cascade:all,级联,如果userinfo加了那么就可以不先保存
// session.save(userGradeBean); System.out.println("-----------" + userGradeBean.getId()); userbean = new UserInfoBean(); userbean.setUserGradeBean(userGradeBean);
userbean.setBirthDate(java.util.Calendar.getInstance()
.getTime());
userbean.setUserName("Gt." + System.currentTimeMillis()); session.save(userbean); } //就这里为什么报错了
public void getUserLit(Session session) {
// TODO Auto-generated method stub UserInfoBean userInfoBean = null;
Set students = new HashSet();
UserGradeBean userGradeBean = new UserGradeBean();
userGradeBean.setGradeName("grad:" + System.currentTimeMillis());
userGradeBean.setCreateTime(java.util.Calendar.getInstance().getTime()); userInfoBean = new UserInfoBean(); userInfoBean.setBirthDate(java.util.Calendar.getInstance().getTime());
userInfoBean.setUserName("XXXX");
userInfoBean.setUserGradeBean(userGradeBean);
students.add(userInfoBean);
userInfoBean = new UserInfoBean(); userInfoBean.setBirthDate(java.util.Calendar.getInstance().getTime());
userInfoBean.setUserName("XXXX");
userInfoBean.setUserGradeBean(userGradeBean);
students.add(userInfoBean);
userInfoBean = new UserInfoBean(); userInfoBean.setBirthDate(java.util.Calendar.getInstance().getTime());
userInfoBean.setUserName("XXXX");
userInfoBean.setUserGradeBean(userGradeBean);
students.add(userInfoBean);
userGradeBean.setUserInfoList(students);
session.save(userGradeBean);
//上面我出现了2个问题,一个是报错,另外一个是:userinfo没有insert语句?
} });
} /*-----------------------------------------------------------------------------*/
private void transctionTemplemnt(IUserinfo iinfo) { System.out.println(sesstionFactory == null ? "null" : "");
Session session = sesstionFactory.openSession();
session.beginTransaction(); iinfo.saveUserGrade(session, null); iinfo.getUserLit(session); session.getTransaction().commit(); session.close();
}}
---------------------------
<?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 package="com.ifacewall.model">
<class name="UserGradeBean" table="usergrad" >
<id
name="id"
column="gids"
unsaved-value="null"
>
<generator class="sequence">
<param name="sequence">usergrad_sequence</param>//这里是oracle的sequence
</generator>
</id>
<property name="gradeName" >
<column name="gname" length="20" />
</property>
<property name="createTime" type="java.util.Date">
<column name="gcreattime" ></column>
</property>
<set name="UserInfoList" cascade="save-update">
<key column="gid"></key>
<one-to-many class="UserInfoBean"/>
</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">
<hibernate-mapping package="com.ifacewall.model">
<class name="UserInfoBean" table="userinfo" >
<id
name="id"
column="id"
type="java.lang.Long"
unsaved-value="null"
>
<generator class="sequence">
<param name="sequence">userinfo_sequence</param>
</generator>
</id>
<property name="userName" type="java.lang.String">
<column name="userName" length="20" />
</property>
<property name="birthDate" type="java.util.Date">
<column name="birthDate" ></column>
</property>
<!-- 默认是懒加载,懒加载:只有去执行获取对象的时候才执行sql,非懒加载:执行的时候直接获取获取
<many-to-one name="userGradeBean" column="gid" cascade="all" lazy="false">
-->
<many-to-one name="userGradeBean" column="gid" cascade="all" >
</many-to-one>
</class>
</hibernate-mapping>
-----------------------------
public class UserGradeBean { private java.lang.Integer id;
private String gradeName;
private Date createTime;
private Set userInfoList = new HashSet();
}
--------------------------------------------------
public class UserInfoBean {
private long id;
private String userName;
private Date birthDate;
private UserGradeBean userGradeBean;
}
------------------------
create sequence userinfo_sequence--另外一个改这个名字usergrad_sequence
minvalue 1
maxvalue 99999999999999999
increment by 1
nocache
;
----------------------------------
Error:org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.ifacewall.model.UserInfoBean#0]
主实体里的UserInfoBean实体必须能在hibernate的session中找到相应的对象
你的主实体中代表UserInfoBean实体主键的字段(就是外键) 值为0
UserInfoBean实体对应的表中没有为0的,就这么简单。
com.ifacewall.model.UserInfoBean#0你配置了事务,整个事务中有错误,给你生成insert也要不能执行,执行了也要回滚,那还生成insert干什么。