hibernate使用annotation进行持久化操作(二)

时间:2022-10-14 21:29:53

 5. 级联持久化操作

  主表DO  
  
 
 
  1. package com.alibaba.corp.metrix.admin.biz.edi.model.domain.taobao;  
  2.   
  3. import java.io.Serializable;  
  4. import java.util.Date;  
  5. import java.util.List;  
  6.   
  7. import javax.persistence.CascadeType;  
  8. import javax.persistence.Column;  
  9. import javax.persistence.Entity;  
  10. import javax.persistence.GeneratedValue;  
  11. import javax.persistence.Id;  
  12. import javax.persistence.OneToMany;  
  13. import javax.persistence.Table;  
  14. import javax.persistence.Transient;  
  15.   
  16. import org.hibernate.annotations.GenericGenerator;  
  17.   
  18.   
  19. @Entity(name = "IfreeOrder")  
  20. @Table(name = "metrix_ifree_order")  
  21. public class IfreeOrder implements Serializable {  
  22.     @Transient  
  23.     private static final long              serialVersionUID = -3466339962287852603L;  
  24.   
  25.     @Id  
  26.     @GenericGenerator(name = "generator", strategy = "assigned")  
  27.     @GeneratedValue(generator = "generator")  
  28.     @Column(name = "id", unique = true, nullable = false)  
  29.     private String                         Id;                                      // 发布id  
  30.   
  31.     @Column(name = "subject")  
  32.     private String                         Subject;                                 // 发布标题  
  33.   
  34.     @Column(name = "one_product_line")  
  35.     private String                         OneProductLine;                          // 一级产品线  
  36.   
  37.     @Column(name = "two_product_line")  
  38.     private String                         TwoProductLine;                          // 二级产品线  
  39.   
  40.     @Column(name = "team")  
  41.     private String                         Team;                                    // 团队  
  42.   
  43.     @Column(name = "applies")  
  44.     private String                         Applys;                                  // 应用,如果有多个,中间用英文逗号隔开  
  45.   
  46.     @Column(name = "pm")  
  47.     private String                         PM;                                      // PM  
  48.   
  49.     @Column(name = "pe")  
  50.     private String                         PE;                                      // PE  
  51.   
  52.     @Column(name = "qa")  
  53.     private String                         QA;                                      // QA  
  54.   
  55.   
  56.     @OneToMany(mappedBy = "ifreeOrder", cascade = CascadeType.ALL)  
  57.     private List<IfreeOrderRelatedProject> ReleateProject;                          // 相关项目  
  58.   
  59.     @Column(name = "gmt_created")  
  60.     private Date                           gmtCreated       = new Date();           // 本地数据库创建时间  
  61.   
  62.     public String getId() {  
  63.         return Id;  
  64.     }  
  65.   
  66.     public void setId(String Id) {  
  67.         this.Id = Id;  
  68.     }  
  69.   
  70.     public String getSubject() {  
  71.         return Subject;  
  72.     }  
  73.   
  74.     public void setSubject(String Subject) {  
  75.         this.Subject = Subject;  
  76.     }  
  77.   
  78.     public String getOneProductLine() {  
  79.         return OneProductLine;  
  80.     }  
  81.   
  82.     public void setOneProductLine(String OneProductLine) {  
  83.         this.OneProductLine = OneProductLine;  
  84.     }  
  85.   
  86.     public String getTwoProductLine() {  
  87.         return TwoProductLine;  
  88.     }  
  89.   
  90.     public void setTwoProductLine(String TwoProductLine) {  
  91.         this.TwoProductLine = TwoProductLine;  
  92.     }  
  93.   
  94.     public String getTeam() {  
  95.         return Team;  
  96.     }  
  97.   
  98.     public void setTeam(String Team) {  
  99.         this.Team = Team;  
  100.     }  
  101.   
  102.     public String getApplys() {  
  103.         return Applys;  
  104.     }  
  105.   
  106.     public void setApplys(String Applys) {  
  107.         this.Applys = Applys;  
  108.     }  
  109.   
  110.     public String getPM() {  
  111.         return PM;  
  112.     }  
  113.   
  114.     public void setPM(String PM) {  
  115.         this.PM = PM;  
  116.     }  
  117.   
  118.     public String getPE() {  
  119.         return PE;  
  120.     }  
  121.   
  122.     public void setPE(String PE) {  
  123.         this.PE = PE;  
  124.     }  
  125.   
  126.     public String getQA() {  
  127.         return QA;  
  128.     }  
  129.   
  130.     public void setQA(String QA) {  
  131.         this.QA = QA;  
  132.     }  
  133.   
  134.     public List<IfreeOrderRelatedProject> getReleateProject() {  
  135.         return ReleateProject;  
  136.     }  
  137.   
  138.     public void setReleateProject(List<IfreeOrderRelatedProject> ReleateProject) {  
  139.         this.ReleateProject = ReleateProject;  
  140.         if (this.ReleateProject != null) {  
  141.             for (IfreeOrderRelatedProject ifreeOrderRelatedProject : this.ReleateProject) {  
  142.                 ifreeOrderRelatedProject.setIfreeOrder(this);  
  143.             }  
  144.         }  
  145.     }  
  146.   
  147.     public Date getGmtCreated() {  
  148.         return gmtCreated;  
  149.     }  
  150.   
  151.     public void setGmtCreated(Date gmtCreated) {  
  152.         this.gmtCreated = gmtCreated;  
  153.     }  
  154. }  

从表对应的DO    
  
 
 
  1. package com.alibaba.corp.metrix.admin.biz.edi.model.domain.taobao;  
  2.   
  3. import java.io.Serializable;  
  4. import java.util.Date;  
  5.   
  6. import javax.persistence.*;  
  7.   
  8. import org.hibernate.annotations.GenericGenerator;  
  9.   
  10.  
  11. @Entity  
  12. @Table(name = "ifree_order_related_project")  
  13. public class IfreeOrderRelatedProject implements Serializable {  
  14.     @Transient  
  15.     private static final long serialVersionUID = -4783733149722014928L;  
  16.   
  17.     @Id  
  18.     @GenericGenerator(name = "generator", strategy = "increment")  
  19.     @GeneratedValue(generator = "generator")  
  20.     @Column(name = "inner_id", unique = true, nullable = false)  
  21.     private Integer index;  
  22.   
  23.     @Column(name = "id")  
  24.     private String Id;  
  25.   
  26.     @Column(name = "project_id")  
  27.     private String projectId; // 项目Id  
  28.   
  29.     @Column(name = "publish_id")  
  30.     private String PublishId; // 发布Id  
  31.   
  32.     @Column(name = "is_last")  
  33.     private String IsLast; // 是否是最后一次发布  
  34.   
  35.     @Column(name = "publish_num")  
  36.     private String PublishNum; // 发布次数  
  37.   
  38.     @ManyToOne  
  39.     @JoinColumn(name = "order_id"//从表的外键,会默认关联主表的主键,不需要字段名相同  
  40.     private IfreeOrder ifreeOrder;  
  41.   
  42.     @Column(name = "gmt_created")  
  43.     private Date gmtCreated = new Date(); // 本地数据库创建时间  
  44.   
  45.     public Integer getIndex() {  
  46.         return index;  
  47.     }  
  48.   
  49.     public void setIndex(Integer index) {  
  50.         this.index = index;  
  51.     }  
  52.   
  53.     public String getId() {  
  54.         return Id;  
  55.     }  
  56.   
  57.     public void setId(String Id) {  
  58.         this.Id = Id;  
  59.     }  
  60.   
  61.     public String getProjectId() {  
  62.         return projectId;  
  63.     }  
  64.   
  65.     public void setProjectId(String projectId) {  
  66.         this.projectId = projectId;  
  67.     }  
  68.   
  69.     public String getPublishId() {  
  70.         return PublishId;  
  71.     }  
  72.   
  73.     public void setPublishId(String PublishId) {  
  74.         this.PublishId = PublishId;  
  75.     }  
  76.   
  77.     public String isIsLast() {  
  78.         return IsLast;  
  79.     }  
  80.   
  81.     public void setIsLast(String IsLast) {  
  82.         this.IsLast = IsLast;  
  83.     }  
  84.   
  85.     public String getPublishNum() {  
  86.         return PublishNum;  
  87.     }  
  88.   
  89.     public void setPublishNum(String PublishNum) {  
  90.         this.PublishNum = PublishNum;  
  91.     }  
  92.   
  93.     public IfreeOrder getIfreeOrder() {  
  94.         return ifreeOrder;  
  95.     }  
  96.   
  97.     public void setIfreeOrder(IfreeOrder ifreeOrder) {  
  98.         this.ifreeOrder = ifreeOrder;  
  99.     }  
  100.   
  101.     public Date getGmtCreated() {  
  102.         return gmtCreated;  
  103.     }  
  104.   
  105.     public void setGmtCreated(Date gmtCreated) {  
  106.         this.gmtCreated = gmtCreated;  
  107.     }  
  108. }  
说明:      1. 上面DO的field名称不规范,是因为接入我们系统序列化后的Json字符串不规范,为了能兼容其它的系统,使用了这种非常恶心的写法。
     2. 上面的DO中我们只使用到了单向关联,主表的CRUD会级联到从表
     3. 注意主表、从表中@OneToMany及@ManyToOne标签的写法
     4. 进行级联保存时,调用主表对应Dao进行save或者saveOrUpdate操作时,可能会抛出update操作,但数据库中row size = 0的异常,这是因为hibernate根据你是否设置了主键ID来判断你进行的是新增或者更新操作,如果你需要持久化的对象主键已经有值了,此时会默认进行update操作,但数据库中此主键还未对应任何数据,因此会抛出异常

本文出自 “黑白灰” 博客,请务必保留此出处http://leonmau.blog.51cto.com/2202260/901125