使用JPA注解@ManyToMany做一个多对多的用例。

为了避免在删除主表数据时同时级联删除从表数据,JPA官方文档建议在主表的从表字段使用级联注解:CascadeType.PERSIST,CascadeType.MERGE,进行配置。

主表代码:

   private Set<Hobby> hobby;

    @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.EAGER)
@JoinTable(name = "CAT_HOBBY",
joinColumns = { @JoinColumn(name = "CAT_ID") },
inverseJoinColumns = { @JoinColumn(name = "HOBBY_ID") })
public Set<Hobby> getHobby() {
return hobby;
}

从表代码:

   private Set<Cat> cat;

    @ManyToMany(mappedBy = "hobby",fetch=FetchType.LAZY)
public Set<Cat> getCat() {
return cat;
}
public void setCat(Set<Cat> cat) {
this.cat = cat;
}

Dao层代码:

    public static Object save(Object obj){
Session session = HibernateUtil.getSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
session.save(obj);
tx.commit();
} catch (RuntimeException e) {
if (tx != null) {
tx.rollback();
}
throw e;
} finally {
session.close();
}
return obj;
}

main代码:

      Cat cat1 = new Cat();
Cat cat2 = new Cat();
cat1.setCat_name("b12_ManyToMany5");
cat2.setCat_name("b12_ManyToMany6"); Set<Hobby> hobbies = new HashSet<Hobby>();
Hobby hobby1 = new Hobby();
hobby1.setName("球1");
hobbies.add(hobby1); Hobby hobby2 = new Hobby();
hobby2.setName("球2");
hobbies.add(hobby2); cat1.setHobby(hobbies);
cat2.setHobby(hobbies); 18 HibernateUtil.save(cat1);
HibernateUtil.save(cat2);
System.out.println(cat1.getId());
System.out.println(cat2.getId());

运行main方法,第18行报如下异常,这应该是一个Hibernate实现JPA接口的一个bug。

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: b12_ManyToMany_JoinTable.Hobby

策略一,使用CascadeType.ALL注解,可以保存,但在删除操作时,产生ERROR: ORA-02292: 违反完整约束条件 (WXUATUSER.FK_ODDM1C9RTQFPO2HI2BCR4OUQX) - 已找到子记录。不可取。

策略二,改用persist方法保存,报异常:detached entity passed to persist。不可取。

    tx = session.beginTransaction();
  session.persist(obj);
  tx.commit();

策略三,使用Hibernate的注解@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE}),增删改查,达到预期的级联效果,删除主表数据不会级联到从表。可取。

org.hibernate.TransientObjectException的更多相关文章

  1. Exception in thread "main" org.hibernate.TransientObjectException: object references an unsaved tran

    今天在使用一对多,多对一保存数据的时候出现了这个错误 Hibernate错误: Exception in thread "main" org.hibernate.Transient ...

  2. org.hibernate.TransientObjectException:The given object has a null identifier

    1.错误描述 org.hibernate.TransientObjectException:The given object has a null identifier:com.you.model.U ...

  3. org.hibernate.TransientObjectException异常

    代码如下: /** * 测试4:新增一个秘书角色,并赋给张三该角色 */ @Test public void test4(){ Session session = HibernateUtils.ope ...

  4. 报错HTTP Status 500 - The given object has a null identifier: cn.itcast.entity.Customer; nested exception is org.hibernate.TransientObjectException: The given object has a null identifier:

    在使用模型驱动封装的时候,要保证表单中name属性名和类中属性名一致,否则将会报错如下: HTTP Status 500 - The given object has a null identifie ...

  5. 关于 org.hibernate.TransientObjectException 异常

    在Hibernate的关联关系中,如果一个对象A 持有 对象 B 的引用,如果先保存 A ,再保存B,那么会出现 org.hibernate.TransientObjectException 异常. ...

  6. Exception occurred during processing request: The given object has a null identifier: com.zsn.crm.Model.SaleVisit; nested exception is org.hibernate.TransientObjectException: The given object has a nu

    edit.jsp页面没有加入隐藏字段 id ,导致模型驱动封装时缺少id ,,调用update更新数据库时出错!

  7. 【Hibernate框架】关联映射(一对一关联映射)

    一.整理思路: 之前,小编总结过Mybatis的关联映射,接下来,再来总结一下hibernate的相关的关联映射,直接上图: 这张图,就是小编整理总结整个Hibernate的关联映射的一个大致思路. ...

  8. Hibernate ManyToOne, OneToMany的理解

    User to Group, Many to One的关系 Test Case 1: session.beginTransaction(); user.setGroup(group); session ...

  9. Hibernate常见错误整理

    Hibernate常见错误合集   1.错误:object references an unsaved transient instance - save the transient instance ...

随机推荐

  1. python_列表

    1.  列表的定义 (1) 用[]包含的元素,就是列表 (2)可以用list函数定义列表 2.  基本的列表操作(可参考示例) (1)元素赋值 (2)删除元素 (3)分片赋值 3. 列表方法 (1) ...

  2. nagios监控linux主机监控内存脚本

    说明 工作包括两部分监控端(一二三)和被监控端(四) 一.nrpe.cfg中添加脚本 nrpe.cfg中添加命令索引 command[check_used_mem]=/usr/local/nagios ...

  3. EBS R12.2快速安装前没有配置Global Inventory报错

    EBS R12.2快速安装前没有配置Global Inventory,导致验证时"file systems"这一项没有通过,被标记了"X": (本图其它两个验证 ...

  4. tomcat下jndi配置

    jndi(Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API.命名服务将名称和对象联系起来,使得我们可以用 ...

  5. java中DriverManager跟DataSource获取getConnection有什么不同?

    1.datasource是与连接池获取连接,而DriverManager是获取与数据库的连接! DriverManager类的主要作用是管理注册到DriverManager中的JDBC驱动程序,并根据 ...

  6. Building a RESTful Web Service Using Spring Boot In Eclipse

    一.构建restful web service 创建Maven的java web工程,maven的pom文件加入依赖包 创建包hello Greeting.java package hello; pu ...

  7. jQuery 扩展功能

    源码如下: /*! * 说明:Jquery库扩展 * 创建时间: leo 2016/10/13 */ (function (window, jQuery, undefined) { jQuery.ex ...

  8. j2ee servlet listener

    JSP/Servlet 中的事件处理写过AWT或Swing程序的人一定对桌面程序的事件处理机制印象深刻:通过实现Listener接口的类可以在特定事件(Event)发生时,呼叫特定的方法来对事件进行响 ...

  9. struts2 radio标签 性别固定选项

    <s:radio list="#{'男':'man', '女':'woman'}" value="'男'" name="users.sex&qu ...

  10. [原创]java WEB学习笔记84:Hibernate学习之路-- -映射 一对一关系 ,基外键的方式实现

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...