工作中遇到的问题--Hibernate一对多保存简化Service层代码
在创建一方的entity是添加一个增加多方的方法:
package com.sim.mfg.data.domain;
import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.MapKeyColumn;
import javax.persistence.MapKeyEnumerated;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import org.hibernate.annotations.Where;
import com.sim.mfg.data.domain.type.GoodType;
import com.sim.mfg.data.domain.type.RelationshipType;
/**
*
* @author damien
*
*/
@Entity
@Table(name = "GOOD")
@Where(clause="enabled=1") //Used for logical delete, disabled objects are always hidden
public class Good extends AMfgObject implements Serializable {
/** serialVersionUID */
private static final long serialVersionUID = -7656499731749432022L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "GOOD_ID", nullable = false)
private Long id;
@Enumerated(EnumType.STRING)
@Column(name = "TYPE", nullable = false)
private GoodType type;
@Column(name = "STATUS")
private String status;
@Column(name = "PRODUCTION_DATE")
private Date productionDate;
@Column(name = "EXPIRY_DATE")
private Date expiryDate;
@JoinColumn(name = "PRODUCT_ID", nullable = false)
@ManyToOne(fetch = FetchType.LAZY, optional = false)
private Product product;
@JoinColumn(name = "FILL_ID")
@ManyToOne(fetch = FetchType.LAZY)
private Fill fill;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "good", cascade = CascadeType.ALL)
@MapKeyColumn(name="TYPE")
@MapKeyEnumerated(EnumType.STRING)
private Map<RelationshipType, Relationship> relationships = new HashMap<RelationshipType, Relationship>();
@OneToMany(fetch = FetchType.LAZY, mappedBy = "good")
private Set<Code> codes;
@OneToMany(fetch = FetchType.EAGER, mappedBy = "good",cascade=CascadeType.ALL)
private Set<GoodStatus> goodStatus;
/**
* Empty constructor
*/
public Good(){}
/**
* Good constructor
* @param type
*/
public Good(GoodType type) {
super();
this.type = type;
}
/**
* Good constructor
* @param type
* @param product
*/
public Good(GoodType type, Product product) {
this(type, product, null, null);
}
/**
* Good constructor
* @param type
* @param product
* @param productionDate
* @param expiryDate
*/
public Good(GoodType type, Product product, Date productionDate, Date expiryDate) {
super();
this.type = type;
this.product = product;
this.productionDate = productionDate;
this.expiryDate = expiryDate;
}
@Override
public void editFrom(AMfgObject object) {
// Not needed for this object
}
/**
* Get relationship for given type
* @param type
* @return
*/
public Relationship getRelationship(RelationshipType type) {
return relationships.get(type);
}
/**
* Add relationship of given type with the given good
* @param type
* @param withGood
*/
public void addRelationship(RelationshipType type, Good withGood) {
if (!relationships.containsKey(type))
relationships.put(type, new Relationship(this, type));
relationships.get(type).add(withGood);
}
/**
* Removed relationship of given type with the given good
* @param type
* @param withGood
*/
public void removeRelationship(RelationshipType type, Good withGood) {
if (relationships.containsKey(type))
relationships.get(type).remove(withGood);
}
/**
* Removed all relationships with the given good
* @param withGood
*/
public void removeAllRelationships(Good withGood) {
relationships.values().forEach(relationship -> relationship.remove(withGood));
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public Product getProduct() {
return product;
}
public void setProduct(Product product) {
this.product = product;
}
public Fill getFill() {
return fill;
}
public void setFill(Fill fill) {
this.fill = fill;
}
public Map<RelationshipType, Relationship> getRelationships() {
return relationships;
}
public void setRelationships(Map<RelationshipType, Relationship> relationships) {
this.relationships = relationships;
}
public GoodType getType() {
return type;
}
public void setType(GoodType type) {
this.type = type;
}
public Set<Code> getCodes() {
return codes;
}
public void setCodes(Set<Code> codes) {
this.codes = codes;
}
public Date getProductionDate() {
return productionDate;
}
public void setProductionDate(Date productionDate) {
this.productionDate = productionDate;
}
public Date getExpiryDate() {
return expiryDate;
}
public void setExpiryDate(Date expiryDate) {
this.expiryDate = expiryDate;
}
public Set<GoodStatus> getGoodStatus() {
return goodStatus;
}
public void setGoodStatus(Set<GoodStatus> goodStatus) {
this.goodStatus = goodStatus;
}
/**
* add GoodStatus directly
* @param goodStatus
*/
public void addGoodStatus(GoodStatus goodStatus){
this.goodStatus.add(goodStatus);
goodStatus.setGood(this); //不设置这句就不会执行update语句!!
}
}
多的一方:
package com.sim.mfg.data.domain;
import java.io.Serializable;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import org.hibernate.annotations.Where;
import com.sim.mfg.data.domain.event.EndUserScan;
import com.sim.mfg.data.domain.type.GoodStatusType;
@Entity
@Table(name = "GOODSTATUS")
@Where(clause = "enabled=1")
public class GoodStatus extends AMfgObject implements Serializable {
/**
*
*/
private static final long serialVersionUID = -1279190303132720639L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "GOODSTATUS_ID", nullable = false)
private Long id;
@Enumerated(EnumType.STRING)
@Column(name = "TYPE")
private GoodStatusType type;
@Column(name = "VALUE")
private String value;
@JoinColumn(name = "ENDUSERSCAN_ID", nullable = false)
@OneToOne(optional = true, fetch = FetchType.LAZY)
private EndUserScan scan;
@JoinColumn(name = "GOOD_ID")
@ManyToOne(optional = true, fetch = FetchType.LAZY,cascade={CascadeType.MERGE,CascadeType.REFRESH})
private Good good;
public GoodStatus() {
super();
}
public GoodStatusType getType() {
return type;
}
public void setType(GoodStatusType type) {
this.type = type;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public EndUserScan getScan() {
return scan;
}
public void setScan(EndUserScan scan) {
this.scan = scan;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Good getGood() {
return good;
}
public void setGood(Good good) {
this.good = good;
}
@Override
public void editFrom(AMfgObject object) {
// TODO Auto-generated method stub
}
}
在GoodService里:
@Override
public void addstatus(Long goodId, GoodStatus goodStatus) {
Good good=goodRepository.findOne(goodId);
good.addGoodStatus(goodStatus);
goodRepository.save(good);
}
工作中遇到的问题--Hibernate一对多保存简化Service层代码的更多相关文章
- 工作中遇到的问题--JPA 一对多查询
/** * order by gs.updateDate desc * SELECT gs FROM GoodStatus gs WHERE gs IN( * @ ...
- 工作中遇到的问题--Hibernate注解添加在一方和多方的区别
以Good和GoodStatus为例: 一.注解仅添加在一方: @Entity@Table(name = "GOOD")@Where(clause="enabled=1& ...
- Hibernate 一对多 保存和修改数据
Student和Sclass表,Student外键cid是Sclass的cid create table sclass( cid ) primary key, cname ) )go create t ...
- 工作中遇到的vscode配合eslint完成保存为eslint格式
vscode个人设置 // vscode的个人设置配置 { "workbench.iconTheme": "vscode-icons", "workb ...
- Hibernate一对多操作
--------------------siwuxie095 Hibernate 一对多操作 以客户和联系人为例,客户是一,联系人是多 即 一个客户里面有多个联系人,一个联系人只能属于一个客户 注意: ...
- Hibernate 一对多
表与表之间关系回顾(重点) 1 一对多 (1)分类和商品关系,一个分类里面有多个商品,一个商品只能属于一个分类 (2)客户和联系人是一对多关系 - 客户:与公司有业务往来,百度.新浪.360 - 联系 ...
- hibernate 一对多双向关联 详解
一.解析: 1. 一对多双向关联也就是说,在加载班级时,能够知道这个班级所有的学生. 同时,在加载学生时,也能够知道这个学生所在的班级. 2.我们知道,一对多关联映射和多对一关联映射是一样的,都是在 ...
- Hibernate一对多OnetoMany
------------------------Hibernate一对多OnetoMany 要点: 配置在一端. 1.如果是单向关联,即只在一端配置OneToMany,多端不配置ManyToOne.则 ...
- Hibernate一对多关系操作
1.创建两个实体类. 一个实体类是商品类,另一个实体类是商品的分类类. 在一对多关系的两个实体中,在编写实体类时必须要遵循以下规则: (1)在一的那一方的实体中,必须要有一个私有的多那一方的实体对象属 ...
随机推荐
- Diskpart使用说明
[查看硬盘信息] 1.打开命令窗口 cmd 2.diskpart 命令进入Diskpart管理程式 3.list disk 查看硬盘信息 list partition 查看分区信息 [初使化硬盘] ...
- Win7 Print Spooler服務自动关闭
对于Win7系统而言,该问题通常是安装了错误的打印驱动引起的,Win7系统为了保护其它进程不受干扰,自动关闭了打印服务. 解决方法就是: a> 把不用的打印机删掉. b> 确保你安装了正确 ...
- 解决问题:centos虚拟机安装好nginx,本机无法访问
阵子在虚拟机上装好了centos5.3,并配好了nginx+php+mysql,但是本机就是无法访问.一直就没去折腾了.具体情况如下1.本机能ping通虚拟机2.虚拟机也能ping通本机3.虚拟机能访 ...
- java读取大容量excel之二(空格、空值问题)
最近在项目中发现,对于Excel2007(底层根本是xml) ,使用<java读取大容量excel之一>中的方式读取,若待读取的excel2007文件中某一列是空值,(注意,所谓的空值是什 ...
- Design Patterns
经典的<设计模式>一书归纳出23种设计模式,本文按<易学设计模式>一书归纳分类如下:1.创建型模式 前面讲过,社会化的分工越来越细,自然在软件设计方面也是如此,因此对象的创建和 ...
- 2016 - 1 -17 GCD学习总结
一:GCD中的两个核心概念,队列与任务: 1.任务:执行什么操作.(代码块 block) 任务执行的类型分为以下两种: 1.1同步执行任务:在当前线程执行任务.不会开辟新的线程. 1.2异步执行任务: ...
- Jul_31 PYTHON REGULAR EXPRESSIONS
1.Special Symbols and Characters 1.1 single regex 1 . ,Match any character(except \n) ^ ,Match start ...
- php大力力 [031节] php设计系统后台菜单和样式设计
php大力力 [031节] php设计系统后台菜单和样式设计 耗掉我一整夜的时间,把后台html设计了一个,对于我这样的html白痴,实属不容易啊. 留下一点点网上查找的网页知识: 索马里论坛群发简介 ...
- 转载大神的dfs讲解
http://acm.hdu.edu.cn/forum/read.php?tid=6158 看完明白了好多! 关于剪枝,没有剪枝的搜索不太可能,这题老刘上课的时候讲过两个剪枝,一个是奇偶剪枝,一个是路 ...
- iPhone各控件的默认高度
1.状态栏 状态栏一般高度为20像素,在打手机或者显示消息时会放大到40像素高,注意,两倍高度的状态栏在好像只能在纵向的模式下使用.如下图 用户可以隐藏状态栏,也可以将状态栏设置为灰色,黑色或者半透明 ...