在创建一方的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层代码的更多相关文章

  1. 工作中遇到的问题--JPA 一对多查询

    /**     *  order by gs.updateDate desc          *  SELECT gs FROM GoodStatus gs WHERE gs IN(     * @ ...

  2. 工作中遇到的问题--Hibernate注解添加在一方和多方的区别

    以Good和GoodStatus为例: 一.注解仅添加在一方: @Entity@Table(name = "GOOD")@Where(clause="enabled=1& ...

  3. Hibernate 一对多 保存和修改数据

    Student和Sclass表,Student外键cid是Sclass的cid create table sclass( cid ) primary key, cname ) )go create t ...

  4. 工作中遇到的vscode配合eslint完成保存为eslint格式

    vscode个人设置 // vscode的个人设置配置 { "workbench.iconTheme": "vscode-icons", "workb ...

  5. Hibernate一对多操作

    --------------------siwuxie095 Hibernate 一对多操作 以客户和联系人为例,客户是一,联系人是多 即 一个客户里面有多个联系人,一个联系人只能属于一个客户 注意: ...

  6. Hibernate 一对多

    表与表之间关系回顾(重点) 1 一对多 (1)分类和商品关系,一个分类里面有多个商品,一个商品只能属于一个分类 (2)客户和联系人是一对多关系 - 客户:与公司有业务往来,百度.新浪.360 - 联系 ...

  7. hibernate 一对多双向关联 详解

    一.解析: 1.  一对多双向关联也就是说,在加载班级时,能够知道这个班级所有的学生. 同时,在加载学生时,也能够知道这个学生所在的班级. 2.我们知道,一对多关联映射和多对一关联映射是一样的,都是在 ...

  8. Hibernate一对多OnetoMany

    ------------------------Hibernate一对多OnetoMany 要点: 配置在一端. 1.如果是单向关联,即只在一端配置OneToMany,多端不配置ManyToOne.则 ...

  9. Hibernate一对多关系操作

    1.创建两个实体类. 一个实体类是商品类,另一个实体类是商品的分类类. 在一对多关系的两个实体中,在编写实体类时必须要遵循以下规则: (1)在一的那一方的实体中,必须要有一个私有的多那一方的实体对象属 ...

随机推荐

  1. 向量和矩阵的范数及MATLAB调用函数

    范数就是长度的一种推广形式,数学语言叫一种度量.比如有一个平面向量,有两个分量来描述:横坐标和纵坐标.向量的二范数就是欧几里得意义下的这个向量的长度.还有一些诸如极大值范数,就是横坐标或者纵坐标的最大 ...

  2. 【数论+技巧】神奇的Noip模拟试题第二试 T1 素数统计

    1.      素数统计 (pcount.pas/.c/.cpp) [问题描述] 小tan的老师揣谙戈给同学们布置了一道题,要求统计给定区间内素数的个数.“这不是很简单吗?”小tan忍不住说.揣谙戈冷 ...

  3. Java 类的一些高级特征

    1. 面向对象的特征二:继承性 * 1.为什么要设计继承性? 继承的出现提高了代码的复用性. 继承的出现让类与类之间产生了关系,提供了多态的前提. * 2.通过"class A extend ...

  4. Oracle Database 11g express edition

    commands : show sys connect sys as sysdba or connect system as sysdba logout or disc clear screen or ...

  5. python 绘图工具 matplotlib 入门

    转自: http://www.cnblogs.com/kaituorensheng/p/3440273.html matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的 ...

  6. 详解模块定义(.def)文件

    一个完整的Windows应用程序(C++程序)通常由五种类型的文件组成:源程序文件,头文件,资源描述文件,项目文件,模块定义文件.本文主要讲解模块定义文件. 模块定义 (.def)文件为链接器提供有关 ...

  7. XML元素和结点的区别

    1.区别介绍 Element是Node的扩展,所以也更实用一些.例如,用Element可以方便的获得Node的属性getAttribute(String attrName)如果用Node,可以得到一个 ...

  8. C++数据结构之List--线性实现

    List(表)类似于队列,不同于队列的是,list可以随机读取/修改/插入某一position,通过position这一位置信息就可以直接修改相应位置的元素.实现方式和队列的类似,多了个positio ...

  9. PHP安装编译配置参考

    编辑安装php的参考配置: ./configure --prefix=/usr/local/php-5.6.8 --with-config-file-path=/usr/local/php-5.6.8 ...

  10. 永不消逝的电波(三):低功耗蓝牙(BLE)入门之如何调戏别人的小米手环

    0×00 前言 蓝牙(Bluetooth),一种无线技术标准,用来让固定与移动设备,在短距离间交换数据,以形成个人局域网(PAN).其使用短波特高频(UHF)无线电波,经由2.4至2.485 GHz的 ...