【问题标题】:One to one relationship insert order in HibernateHibernate中的一对一关系插入顺序
【发布时间】:2014-06-28 19:45:04
【问题描述】:

我有两个彼此之间具有一对一关联的实体。 两个实体都有复合自然主键。一个实体使用其自然复合键中的 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(s) 和 HallPlacesSchema(s) 时出现问题,完全按照这个顺序。

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

当会话刷新时,我看到 Hibernate 首先 INSERTs 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.....

【问题讨论】:

    标签: hibernate flush one-to-one


    【解决方案1】:

    请忽略我的问题,我的测试类中有一个错误导致首先明确插入 HallPlacesSchema。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-20
      • 2011-07-21
      • 1970-01-01
      • 2014-07-12
      • 2010-10-21
      • 1970-01-01
      • 1970-01-01
      • 2017-02-12
      相关资源
      最近更新 更多