Отношение один к одному порядок вставки в гибернации

#hibernate #flush #one-to-one

#спящий режим #сброс #один к одному

Вопрос:

У меня есть две сущности, которые имеют взаимно однозначную связь друг с другом. Оба объекта имеют составные естественные первичные ключи. Один объект использует 1 поле из своего естественного составного ключа и один дополнительный столбец для ссылки на другой объект. У меня проблема с сохранением этих объектов, Hibernate сначала вставляет объекты, ссылающиеся на ссылки (насколько я понимаю, это HallPlacesSchema), поэтому я сразу получаю ошибку нарушения ограничений до того, как будут вставлены объекты, на которые ссылаются (Hall).

 CREATE TABLE webgatemarket_TssHallPlacesSchema (
  TSSHALLPLACESSCHEMAID            INTEGER          NOT NULL,
  WEBGATEMARKET_ID                 INT(11) UNSIGNED NOT NULL,
  TSSHALLID                        INTEGER          NOT NULL,

  PRIMARY KEY (TSSHALLPLACESSCHEMAID, WEBGATEMARKET_ID),
  FOREIGN KEY (WEBGATEMARKET_ID, TSSHALLID) REFERENCES webgatemarket_TssHall(WEBGATEMARKET_ID, TSSHALLID),
  FOREIGN KEY (WEBGATEMARKET_ID) REFERENCES webgatemarkets (cinema_id),
  INDEX (WEBGATEMARKET_ID, TSSHALLPLACESSCHEMAID)
) ENGINE =InnoDB, DEFAULT CHARSET =utf8;

CREATE TABLE webgatemarket_TssHall (
  TSSHALLID           INTEGER          NOT NULL,
  WEBGATEMARKET_ID    INT(11) UNSIGNED NOT NULL,

  PRIMARY KEY (TSSHALLID, WEBGATEMARKET_ID),
  FOREIGN KEY (WEBGATEMARKET_ID) REFERENCES webgatemarkets (cinema_id)
) ENGINE =InnoDB, DEFAULT CHARSET =utf8;


public class DataObjectPk implements Serializable
{
    @Id
    private int id;

    @ManyToOne
    @JoinColumn(name = "WEBGATEMARKET_ID")
    private WebGateMarketDO webGateMarket;
}

@IdClass(DataObjectPk.class)
public class Hall
{
    @Id
    @Column(name = "TSSHALLID")
    private int id;

    @ManyToOne
    @JoinColumn(name = "WEBGATEMARKET_ID")
    private WebGateMarketDO webGateMarket;

    @OneToOne(mappedBy = "hall")
    private HallPlacesSchema hallPlacesSchema;
}

@IdClass(DataObjectPk.class)
public class HallPlacesSchema extends DataObject
{
    @Id
    private int id;

    @ManyToOne
    @JoinColumn(name = "WEBGATEMARKET_ID")
    private WebGateMarketDO webGateMarket;

    @Column(name = "TSSHALLID")
    private Integer hallId;

    @OneToOne
    @JoinColumns({
            @JoinColumn(name = "TSSHALLID", referencedColumnName = "TSSHALLID", insertable = false, updatable = false),
            @JoinColumn(name = "WEBGATEMARKET_ID", referencedColumnName = "WEBGATEMARKET_ID", insertable = false, updatable = false)
    })
    private Hall hall;
}
  

Проблема возникает, когда в одном сеансе я сохраняю Hall (ы), а затем HallPlacesSchema (ы), именно в этом порядке.

 entityManager.persist(halls); 
entityManager.persist(hallPlacesSchemas);
entityManager.flush();
  

Когда сеанс сбрасывается, я вижу, что режим гибернации сначала вставляет объекты HallPlacesSchema, поэтому я сразу получаю сообщение об ошибке нарушения ограничений: невозможно добавить или обновить дочернюю строку: сбой ограничения внешнего ключа….

Кто-нибудь может помочь мне понять, почему это так?

 Hibernate: 
    /* insert HallPlacesSchema
        */ insert 
        into
            webgatemarket_TssHallPlacesSchema
            (DELFLAG, UPDATENUM, TSSHALLPLACESCHEMA_BACKGROUND, TSSHALLID, TSSHALLPLACESCHEMA_HEIGHT, TSSHALLPLACESCHEMA_ISDEFAULT, TSSHALLPLACESCHEMA_NAME, TSSHALLPLACESCHEMA_PLACE_HEIGHT, TSSHALLPLACESCHEMA_PLACE_WIDTH, SAREAID, TSSHALLPLACESCHEMA_SCALE_FACTOR, TSSHALLPLACESCHEMA_SECTORS_COUNT, TSSHALLPLACESCHEMA_WIDTH, TSSHALLPLACESSCHEMAID, WEBGATEMARKET_ID) 
        values
            (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
2014-06-28 22:31:39,126 WARN  [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] : SQL Error: 1452, SQLState: 23000
2014-06-28 22:31:39,126 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] : Cannot add or update a child row: a foreign key constraint fails.....
  

Ответ №1:

Пожалуйста, не обращайте внимания на мой вопрос, в моих тестовых классах была ошибка, которая сначала явно вызывала вставку HallPlacesSchema .