zoukankan      html  css  js  c++  java
  • Hibernate持久化对象修改id重新保存的办法

    Hibernate持久化对象修改id重新保存的办法——Hibernate学习记录二

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/womeng2009/article/details/78502912

    昨天在工作中遇到一个特殊的场景,点击修改,对一条发布状态的记录进行复制,并生成一个草稿版本,也就是同一条记录的不同状态,也就出现需要从数据库get之后把id置空重新保存,这里出现一个问题,但Hibernate的持久化对象是无法对id进行修改操作的,需要重新new一个全新的对象存储才可以,但Java中的机制,如果采用new Object()并赋值的的方式并不是真的产生一个新的对象,而是引用赋值,即传递内存地址,学过C语言的很容易理解。

    要实现这种需求,就要复制出一个全新的对象,Java提供了一种解决办法——对象克隆。

    对象克隆的方法:

    实体类实现Cloneable接口,然后在实体类中重写clone()方法,以User类为例,如下所示:

    1. package com.domain;
    2.  
    3. /**
    4. * Created by Jiro.Chen on 2017/11/6.
    5. */
    6. public class User implements Cloneable {
    7. private String id;
    8. private String name;
    9. private Integer age;
    10. private String address;
    11.  
    12. public String getId() {
    13. return id;
    14. }
    15.  
    16. public void setId(String id) {
    17. this.id = id;
    18. }
    19.  
    20. public String getName() {
    21. return name;
    22. }
    23.  
    24. public void setName(String name) {
    25. this.name = name;
    26. }
    27.  
    28. public Integer getAge() {
    29. return age;
    30. }
    31.  
    32. public void setAge(Integer age) {
    33. this.age = age;
    34. }
    35.  
    36. public String getAddress() {
    37. return address;
    38. }
    39.  
    40. public void setAddress(String address) {
    41. this.address = address;
    42. }
    43.  
    44. public boolean equals(Object o) {
    45. if (this == o) return true;
    46. if (o == null || getClass() != o.getClass()) return false;
    47.  
    48. User user = (User) o;
    49.  
    50. if (id != null ? !id.equals(user.id) : user.id != null) return false;
    51. if (name != null ? !name.equals(user.name) : user.name != null) return false;
    52. if (age != null ? !age.equals(user.age) : user.age != null) return false;
    53. if (address != null ? !address.equals(user.address) : user.address != null) return false;
    54.  
    55. return true;
    56. }
    57.  
    58. public int hashCode() {
    59. int result = id != null ? id.hashCode() : 0;
    60. result = 31 * result + (name != null ? name.hashCode() : 0);
    61. result = 31 * result + (age != null ? age.hashCode() : 0);
    62. result = 31 * result + (address != null ? address.hashCode() : 0);
    63. return result;
    64. }
    65.  
    66. @Override
    67. public Object clone(){
    68. User user = null;
    69. try {
    70. user = (User)super.clone();
    71. }catch (CloneNotSupportedException e){
    72. e.printStackTrace();
    73. }
    74. return user;
    75. }
    76. }

    这样使用的时候,User user1 =  new User();    User user2 = user1.clone();即可将user1的所有属性值复制给user2,但他们是两个对象,而不是同一个对象的引用。之后可以进行id的修改,然后用Hibernate进行保存,生成一条新的记录。

  • 相关阅读:
    程序员的出路在哪里
    基于.NET平台常用的框架整理
    Asp.Net MVC WebApi2 自动生成帮助文档
    Jquery操作select选项集合,判断集合中是否存在option
    C#三种判断数据库中取出的字段值是否为空(NULL) 的方法
    未能加载文件或程序集“XX.XXX.Web”或它的某一个依赖项。试图加载格式不正确的程序
    网页设计制作面试题(1)
    HTML5 Canvas 画纸飞机组件
    HTML5 Canvas 画虚线组件
    C# 根据域名获取IP地址
  • 原文地址:https://www.cnblogs.com/libin6505/p/10224595.html
Copyright © 2011-2022 走看看