У меня есть родитель с:
@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;
}
}
Проблема появляется, когда у меня новое DrawingRevision с DrawingRevisionID = 0. Я ожидаю, что DrawingRevisionManufacturing будет корректно обновлять свой идентификатор на основе CascadeType.ALL.
На своем уровне обслуживания я проверяю наличие ассоциации:
if (rev.getManufacturing().getDrawingRevisionID()==0) {
rev.getManufacturing().setDrawingRevision(rev);
}
С этим кодом, я получаю нарушение ограничения внешнего ключа, потому что он пытается вставить запись в DrawingRvision_manufacturing с DrawingRevisionID 0 (что не хорошо).
Если я изменю setDrawingRevision()
на
public void setDrawingRevision(DrawingRevision drawingRevision) {
this.drawingRevision = drawingRevision;
this.drawingRevisionID = drawingRevision.getDrawingRevisionID();
}
затем я получаю сообщение об ошибке гибернации, что идентификатор экземпляра был изменен с 0 на 10322 (или любое другое число).
Чего мне не хватает, что позволит мне успешно сохранить новое DrawingRevision?