当前位置: 首页 > 知识库问答 >
问题:

Hibernate中的一对一关系插入顺序

江阳冰
2023-03-14

我有两个实体,它们之间有一对一的联系。这两个实体都具有复合自然主键。一个实体使用其自然组合键中的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;
}

在单个会话中,我完全按照该顺序坚持霍尔,然后是霍尔广场化学时,问题就出现了。

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.....

共有1个答案

曾云
2023-03-14

请忽略我的问题,在我的测试类中有一个错误,导致首先插入霍尔广场化学。

 类似资料:
  • 问题内容: 我有一对一的关系,但是hibernatetool在生成模式时抱怨。这是显示问题的示例: 人与OtherInfo具有一对一关系: 人是OtherInfo的拥有方。OtherInfo是拥有方,因此person用于在Person中指定属性名称“ otherInfo”。 使用hibernatetool生成数据库架构时出现以下错误: 知道为什么吗?我是在做错什么还是这是Hibernate错误?

  • 我在hibernate中搜索建立关系的各种可能性,遇到了下面的代码片段

  • 无法添加或更新子行:外键约束失败(.,约束外键()引用()) 如果我删除,insert操作将会很好地工作。在将对象插入数据库之前,我检查了这些对象,并确保包含,包含。 用于创建和的SQL脚本为: Hibernate:创建表b(b_id integer not null auto_increment,string_results longtext,a_id integer,主键(b_id)) Hib

  • 救命啊!我只在一对多关系数据库中插入POJO时遇到问题。我有POJO和误解如何插入数据库中的所有列表??? 请帮帮我伙计们!

  • 我正在学习冬眠,只是有点困惑。

  • 我有一个springboot应用程序,其中我有一个postgres数据库,里面有一个电影院列表: 这些影院中的每一个都显示一部或多部电影(在另一个数据库中)。我创建了一个关系表: 在最后一个表中,cinema_id是链接到cinemas表中id的外键。movie_id只是一个表示另一个数据库中的id的整数。 我的实体表示形式: 当我试着去看属于个人影院的电影时,问题就来了: null 我做错了什么