代码之家  ›  专栏  ›  技术社区  ›  Tim

一对一和mapsId的Spring数据JPA错误

  •  0
  • Tim  · 技术社区  · 6 年前

    我的父母有:

    @Entity
    @Table(name="engineering.drawingrevisions")
    public class DrawingRevision implements DrawingRevisionInterface, Serializable {
        private int drawingRevisionID;
        private DrawingRevisionManufacturing manufacturing;
    
        @Id
        @Column(name="pk_drawingrevisionid")
        @GeneratedValue(strategy = GenerationType.IDENTITY)    
        @Override
        public int getDrawingRevisionID() {
            return drawingRevisionID;
        }
    
        public void setDrawingRevisionID(int drawingRevisionID) {
            this.drawingRevisionID = drawingRevisionID;
        }
    
        @OneToOne(mappedBy="drawingRevision", cascade=CascadeType.ALL, fetch=FetchType.LAZY)
        @JsonView({View.DrawingRevisionView.class,View.DrawingView.class,View.RFQueueView.class})
        public DrawingRevisionManufacturing getManufacturing() {
            return manufacturing;
        }
    
        public void setManufacturing(DrawingRevisionManufacturing manufacturing) {
            if (manufacturing==null) {
                if (this.manufacturing!=null) {
                    this.manufacturing.setDrawingRevision(null);
                }
            } else {
                manufacturing.setDrawingRevision(this);
            }
            this.manufacturing = manufacturing;
        }
    }
    

    相应的孩子:

    @Entity
    @Table(name="engineering.drawingrevision_manufacturing")
    public class DrawingRevisionManufacturing implements Serializable {
        private static final long serialVersionUID = 1L;
    
        private int drawingRevisionID;
        private DrawingRevision drawingRevision;
    
        public DrawingRevisionManufacturing() {
        }
    
        @Id
        @Column(name="fk_drawingrevisionid")
        public int getDrawingRevisionID() {
            return drawingRevisionID;
        }
    
        public void setDrawingRevisionID(int drawingRevisionID) {
            this.drawingRevisionID = drawingRevisionID;
        }
    
        @OneToOne
        @MapsId("drawingRevisionID")
        @JoinColumn(name="fk_drawingrevisionid")
        public DrawingRevision getDrawingRevision() {
            return drawingRevision;
        }
    
        public void setDrawingRevision(DrawingRevision drawingRevision) {
            this.drawingRevision = drawingRevision;
        }
    }
    

    当我有一个drawingRevisionID=0的新drawingRevisionID时,问题就出现了。我希望DrawingRevisionManufacturing将根据CascadeType.ALL正确更新其ID。

    在我的服务层中,我确保存在关联:

    if (rev.getManufacturing().getDrawingRevisionID()==0) {
        rev.getManufacturing().setDrawingRevision(rev);
    }
    

    使用此代码,则会出现外键约束冲突,因为它试图在drawingRevisionID为0的drawingRevisionID制造中插入条目(这不好)。

    如果我改变 setDrawingRevision() 成为

    public void setDrawingRevision(DrawingRevision drawingRevision) {
        this.drawingRevision = drawingRevision;
        this.drawingRevisionID = drawingRevision.getDrawingRevisionID();
    }
    

    然后我得到一个hibernate错误,一个实例的标识符从0更改为10322(或任何数字)。

    我缺少了什么可以让我成功保存新的绘图修订版?

    1 回复  |  直到 6 年前
        1
  •  0
  •   avishka eranga    6 年前

    在DrawingRevisionManufacturing实体中添加以下代码,

    @OneToOne
    @MapsId("drawingRevisionID")
    @JoinColumn(name="fk_drawingrevisionid" ,referencedColumnName ="pk_drawingrevisionid")
    public DrawingRevision getDrawingRevision() {
        return drawingRevision;
    }
    

    如有任何问题,请通知