Ошибка Spring Data JPA с взаимно-однозначным и mapsId - PullRequest
0 голосов
/ 18 января 2019

У меня есть родитель с:

@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?

1 Ответ

0 голосов
/ 18 января 2019

В объекте DrawingRevisionManufacturing добавить код ниже,

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

если возникнут проблемы, сообщите

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...