Java 随机约束行为

Java 随机约束行为,java,mysql,sql,hibernate,Java,Mysql,Sql,Hibernate,我尝试将1个值插入表'beleg_kopf',然后将1个值插入'beleg_kunden',然后将1到n个值插入'beleg_positionen'。在SQL代码中可以看到外键。 当我的电脑正常快速运行时,由于外键约束故障,插入总是失败。但是当我的电脑速度非常慢时,它就正常工作了 该错误只是一个谎言,因为行的插入顺序不正确,当PC速度太慢,每次插入都需要半分钟时,下一次插入会识别上一个表中已经存在的行。但在正常执行速度下,Hibernate忘记了值已经存在 这个问题几乎不可能重建,而且完全是随机

我尝试将1个值插入表'beleg_kopf',然后将1个值插入'beleg_kunden',然后将1到n个值插入'beleg_positionen'。在SQL代码中可以看到外键。 当我的电脑正常快速运行时,由于外键约束故障,插入总是失败。但是当我的电脑速度非常慢时,它就正常工作了

该错误只是一个谎言,因为行的插入顺序不正确,当PC速度太慢,每次插入都需要半分钟时,下一次插入会识别上一个表中已经存在的行。但在正常执行速度下,Hibernate忘记了值已经存在

这个问题几乎不可能重建,而且完全是随机发生的

错误消息:

CREATE TABLE IF NOT EXISTS `beleg_kopf` (
  `belegnr` INT(8) NOT NULL AUTO_INCREMENT,
  `auftrag` INT(9) NOT NULL,
  `typ` VARCHAR(1) NOT NULL,
  `datum` DATE NOT NULL,
  `payterms` INT(2) NULL,
  PRIMARY KEY (`belegnr`)
ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS `beleg_kunden` (
  `belegnr` INT(8) NOT NULL,
  `kdnr` INT(5) NOT NULL,
  `typ` INT(2) NOT NULL,
  `name` VARCHAR(80) NOT NULL,
  `vorname` VARCHAR(80) NULL,
  `strasse` VARCHAR(80) NULL,
  `hausnr` VARCHAR(15) NULL,
  `adresse2` VARCHAR(80) NULL,
  `plz` VARCHAR(10) NOT NULL,
  `ort` VARCHAR(80) NOT NULL,
  `land` INT(3) NOT NULL,
  `uid` VARCHAR(30) NULL,
  PRIMARY KEY (`belegnr`),
  CONSTRAINT `bkd_belegnr`
    FOREIGN KEY (`belegnr`)
    REFERENCES `beleg_kopf` (`belegnr`)
    ON DELETE RESTRICT
    ON UPDATE CASCADE
ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS `beleg_positionen` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `belegnr` INT(8) NOT NULL,
  `anzahl` DECIMAL(7,2) UNSIGNED NOT NULL,
  `einheit` VARCHAR(15) NULL,
  `bezeichnung` VARCHAR(200) NOT NULL,
  `preis` DECIMAL(8,2) NOT NULL,
  PRIMARY KEY (`id`),
  INDEX `bpos_belegnr_idx` (`belegnr` ASC),
  CONSTRAINT `bpos_belegnr`
    FOREIGN KEY (`belegnr`)
    REFERENCES `beleg_kopf` (`belegnr`)
    ON DELETE RESTRICT
    ON UPDATE CASCADE)
ENGINE = InnoDB;
@Entity
@Table(name="beleg_kopf")
@SequenceGenerator(name="belegnr", initialValue = 1, allocationSize = 1)
public class BelegKopf implements BaseDTO {
    @Id
    @Column(name="belegnr", nullable = false, length = 8)
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int belegnr;

    @Column(name="auftrag", nullable = false, length = 9)
    private int auftrag;

    @Column(name="typ", nullable = false, length = 2)
    private char typ;

    @Column(name="datum", nullable = false)
    @Temporal(TemporalType.DATE)
    private Date datum;

    @Column(name="payterms", nullable = true, length = 2)
    private int payterms;

    ...
}

@Entity
@Table(name="beleg_kunden")
public class BelegKunde implements BaseDTO {
    @Id
    @Column(name="belegnr", nullable = false, length = 8)
    private int belegnr;

    @Column(name="kdnr", nullable = false, length = 5)
    private int kdnr;

    @Column(name="typ", nullable = false, length = 2)
    private int typ;

    @Column(name="name", nullable = false, length = 80)
    private String name;

    @Column(name="vorname", nullable = true, length = 80)
    private String vorname;

    @Column(name="strasse", nullable = true, length = 80)
    private String strasse;

    @Column(name="hausnr", nullable = true, length = 15)
    private String hausnr;

    @Column(name="adresse2", nullable = true, length = 80)
    private String adresse2;

    @Column(name="plz", nullable = false, length = 10)
    private String plz;

    @Column(name="ort", nullable = false, length = 80)
    private String ort;

    @Column(name="land", nullable = false, length = 3)
    private int land;

    @Column(name="uid", nullable = true, length = 30)
    private String uid;

    ...
}

@Entity
@Table(name="beleg_positionen")
@SequenceGenerator(name="id", initialValue = 1, allocationSize = 1)
public class BelegPosition implements BaseDTO {
    @Id
    @Column(name="id", nullable = false)
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;

    @Column(name="belegnr", nullable = false, length = 8)
    private int belegnr;

    @Column(name="anzahl", nullable = false, length = 7, precision = 2)
    private double anzahl;

    @Column(name="einheit", nullable = true, length = 15)
    private String einheit;

    @Column(name="bezeichnung", nullable = false, length = 200)
    private String bezeichnung;

    @Column(name="preis", nullable = false, length = 8, precision = 2)
    private double preis;

    ...
}
public static void createBeleg(BelegKopf kopf, BelegKunde kunde, List<BelegPosition> pos) throws DatabaseException {
    Session hsession = null;
    Transaction htransaction = null;

    try {
        hsession = HibernateUtil.getSessionFactory().openSession();
        htransaction = hsession.beginTransaction();

        hsession.save(kopf);
        hsession.save(kunde);

        for (BelegPosition p : pos)
            hsession.save(p);

        htransaction.commit();
    } catch (HibernateException ex) {
        if (htransaction != null)
            htransaction.rollback();

        throw new DatabaseException(ex);
    } finally {
        if (hsession != null)
            hsession.close();
    }
}
MySQLIntegrityConstraintViolationException:无法添加或更新 子行:外键约束失败(
beleg_kunden
,约束
bkd\u-belegnr
外键(
belegnr
)参考
beleg\u-kopf
belegnr
)在更新级联中)

SQL DDL:

CREATE TABLE IF NOT EXISTS `beleg_kopf` (
  `belegnr` INT(8) NOT NULL AUTO_INCREMENT,
  `auftrag` INT(9) NOT NULL,
  `typ` VARCHAR(1) NOT NULL,
  `datum` DATE NOT NULL,
  `payterms` INT(2) NULL,
  PRIMARY KEY (`belegnr`)
ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS `beleg_kunden` (
  `belegnr` INT(8) NOT NULL,
  `kdnr` INT(5) NOT NULL,
  `typ` INT(2) NOT NULL,
  `name` VARCHAR(80) NOT NULL,
  `vorname` VARCHAR(80) NULL,
  `strasse` VARCHAR(80) NULL,
  `hausnr` VARCHAR(15) NULL,
  `adresse2` VARCHAR(80) NULL,
  `plz` VARCHAR(10) NOT NULL,
  `ort` VARCHAR(80) NOT NULL,
  `land` INT(3) NOT NULL,
  `uid` VARCHAR(30) NULL,
  PRIMARY KEY (`belegnr`),
  CONSTRAINT `bkd_belegnr`
    FOREIGN KEY (`belegnr`)
    REFERENCES `beleg_kopf` (`belegnr`)
    ON DELETE RESTRICT
    ON UPDATE CASCADE
ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS `beleg_positionen` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `belegnr` INT(8) NOT NULL,
  `anzahl` DECIMAL(7,2) UNSIGNED NOT NULL,
  `einheit` VARCHAR(15) NULL,
  `bezeichnung` VARCHAR(200) NOT NULL,
  `preis` DECIMAL(8,2) NOT NULL,
  PRIMARY KEY (`id`),
  INDEX `bpos_belegnr_idx` (`belegnr` ASC),
  CONSTRAINT `bpos_belegnr`
    FOREIGN KEY (`belegnr`)
    REFERENCES `beleg_kopf` (`belegnr`)
    ON DELETE RESTRICT
    ON UPDATE CASCADE)
ENGINE = InnoDB;
@Entity
@Table(name="beleg_kopf")
@SequenceGenerator(name="belegnr", initialValue = 1, allocationSize = 1)
public class BelegKopf implements BaseDTO {
    @Id
    @Column(name="belegnr", nullable = false, length = 8)
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int belegnr;

    @Column(name="auftrag", nullable = false, length = 9)
    private int auftrag;

    @Column(name="typ", nullable = false, length = 2)
    private char typ;

    @Column(name="datum", nullable = false)
    @Temporal(TemporalType.DATE)
    private Date datum;

    @Column(name="payterms", nullable = true, length = 2)
    private int payterms;

    ...
}

@Entity
@Table(name="beleg_kunden")
public class BelegKunde implements BaseDTO {
    @Id
    @Column(name="belegnr", nullable = false, length = 8)
    private int belegnr;

    @Column(name="kdnr", nullable = false, length = 5)
    private int kdnr;

    @Column(name="typ", nullable = false, length = 2)
    private int typ;

    @Column(name="name", nullable = false, length = 80)
    private String name;

    @Column(name="vorname", nullable = true, length = 80)
    private String vorname;

    @Column(name="strasse", nullable = true, length = 80)
    private String strasse;

    @Column(name="hausnr", nullable = true, length = 15)
    private String hausnr;

    @Column(name="adresse2", nullable = true, length = 80)
    private String adresse2;

    @Column(name="plz", nullable = false, length = 10)
    private String plz;

    @Column(name="ort", nullable = false, length = 80)
    private String ort;

    @Column(name="land", nullable = false, length = 3)
    private int land;

    @Column(name="uid", nullable = true, length = 30)
    private String uid;

    ...
}

@Entity
@Table(name="beleg_positionen")
@SequenceGenerator(name="id", initialValue = 1, allocationSize = 1)
public class BelegPosition implements BaseDTO {
    @Id
    @Column(name="id", nullable = false)
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;

    @Column(name="belegnr", nullable = false, length = 8)
    private int belegnr;

    @Column(name="anzahl", nullable = false, length = 7, precision = 2)
    private double anzahl;

    @Column(name="einheit", nullable = true, length = 15)
    private String einheit;

    @Column(name="bezeichnung", nullable = false, length = 200)
    private String bezeichnung;

    @Column(name="preis", nullable = false, length = 8, precision = 2)
    private double preis;

    ...
}
public static void createBeleg(BelegKopf kopf, BelegKunde kunde, List<BelegPosition> pos) throws DatabaseException {
    Session hsession = null;
    Transaction htransaction = null;

    try {
        hsession = HibernateUtil.getSessionFactory().openSession();
        htransaction = hsession.beginTransaction();

        hsession.save(kopf);
        hsession.save(kunde);

        for (BelegPosition p : pos)
            hsession.save(p);

        htransaction.commit();
    } catch (HibernateException ex) {
        if (htransaction != null)
            htransaction.rollback();

        throw new DatabaseException(ex);
    } finally {
        if (hsession != null)
            hsession.close();
    }
}
休眠代码:

CREATE TABLE IF NOT EXISTS `beleg_kopf` (
  `belegnr` INT(8) NOT NULL AUTO_INCREMENT,
  `auftrag` INT(9) NOT NULL,
  `typ` VARCHAR(1) NOT NULL,
  `datum` DATE NOT NULL,
  `payterms` INT(2) NULL,
  PRIMARY KEY (`belegnr`)
ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS `beleg_kunden` (
  `belegnr` INT(8) NOT NULL,
  `kdnr` INT(5) NOT NULL,
  `typ` INT(2) NOT NULL,
  `name` VARCHAR(80) NOT NULL,
  `vorname` VARCHAR(80) NULL,
  `strasse` VARCHAR(80) NULL,
  `hausnr` VARCHAR(15) NULL,
  `adresse2` VARCHAR(80) NULL,
  `plz` VARCHAR(10) NOT NULL,
  `ort` VARCHAR(80) NOT NULL,
  `land` INT(3) NOT NULL,
  `uid` VARCHAR(30) NULL,
  PRIMARY KEY (`belegnr`),
  CONSTRAINT `bkd_belegnr`
    FOREIGN KEY (`belegnr`)
    REFERENCES `beleg_kopf` (`belegnr`)
    ON DELETE RESTRICT
    ON UPDATE CASCADE
ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS `beleg_positionen` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `belegnr` INT(8) NOT NULL,
  `anzahl` DECIMAL(7,2) UNSIGNED NOT NULL,
  `einheit` VARCHAR(15) NULL,
  `bezeichnung` VARCHAR(200) NOT NULL,
  `preis` DECIMAL(8,2) NOT NULL,
  PRIMARY KEY (`id`),
  INDEX `bpos_belegnr_idx` (`belegnr` ASC),
  CONSTRAINT `bpos_belegnr`
    FOREIGN KEY (`belegnr`)
    REFERENCES `beleg_kopf` (`belegnr`)
    ON DELETE RESTRICT
    ON UPDATE CASCADE)
ENGINE = InnoDB;
@Entity
@Table(name="beleg_kopf")
@SequenceGenerator(name="belegnr", initialValue = 1, allocationSize = 1)
public class BelegKopf implements BaseDTO {
    @Id
    @Column(name="belegnr", nullable = false, length = 8)
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int belegnr;

    @Column(name="auftrag", nullable = false, length = 9)
    private int auftrag;

    @Column(name="typ", nullable = false, length = 2)
    private char typ;

    @Column(name="datum", nullable = false)
    @Temporal(TemporalType.DATE)
    private Date datum;

    @Column(name="payterms", nullable = true, length = 2)
    private int payterms;

    ...
}

@Entity
@Table(name="beleg_kunden")
public class BelegKunde implements BaseDTO {
    @Id
    @Column(name="belegnr", nullable = false, length = 8)
    private int belegnr;

    @Column(name="kdnr", nullable = false, length = 5)
    private int kdnr;

    @Column(name="typ", nullable = false, length = 2)
    private int typ;

    @Column(name="name", nullable = false, length = 80)
    private String name;

    @Column(name="vorname", nullable = true, length = 80)
    private String vorname;

    @Column(name="strasse", nullable = true, length = 80)
    private String strasse;

    @Column(name="hausnr", nullable = true, length = 15)
    private String hausnr;

    @Column(name="adresse2", nullable = true, length = 80)
    private String adresse2;

    @Column(name="plz", nullable = false, length = 10)
    private String plz;

    @Column(name="ort", nullable = false, length = 80)
    private String ort;

    @Column(name="land", nullable = false, length = 3)
    private int land;

    @Column(name="uid", nullable = true, length = 30)
    private String uid;

    ...
}

@Entity
@Table(name="beleg_positionen")
@SequenceGenerator(name="id", initialValue = 1, allocationSize = 1)
public class BelegPosition implements BaseDTO {
    @Id
    @Column(name="id", nullable = false)
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;

    @Column(name="belegnr", nullable = false, length = 8)
    private int belegnr;

    @Column(name="anzahl", nullable = false, length = 7, precision = 2)
    private double anzahl;

    @Column(name="einheit", nullable = true, length = 15)
    private String einheit;

    @Column(name="bezeichnung", nullable = false, length = 200)
    private String bezeichnung;

    @Column(name="preis", nullable = false, length = 8, precision = 2)
    private double preis;

    ...
}
public static void createBeleg(BelegKopf kopf, BelegKunde kunde, List<BelegPosition> pos) throws DatabaseException {
    Session hsession = null;
    Transaction htransaction = null;

    try {
        hsession = HibernateUtil.getSessionFactory().openSession();
        htransaction = hsession.beginTransaction();

        hsession.save(kopf);
        hsession.save(kunde);

        for (BelegPosition p : pos)
            hsession.save(p);

        htransaction.commit();
    } catch (HibernateException ex) {
        if (htransaction != null)
            htransaction.rollback();

        throw new DatabaseException(ex);
    } finally {
        if (hsession != null)
            hsession.close();
    }
}
休眠插入代码:

CREATE TABLE IF NOT EXISTS `beleg_kopf` (
  `belegnr` INT(8) NOT NULL AUTO_INCREMENT,
  `auftrag` INT(9) NOT NULL,
  `typ` VARCHAR(1) NOT NULL,
  `datum` DATE NOT NULL,
  `payterms` INT(2) NULL,
  PRIMARY KEY (`belegnr`)
ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS `beleg_kunden` (
  `belegnr` INT(8) NOT NULL,
  `kdnr` INT(5) NOT NULL,
  `typ` INT(2) NOT NULL,
  `name` VARCHAR(80) NOT NULL,
  `vorname` VARCHAR(80) NULL,
  `strasse` VARCHAR(80) NULL,
  `hausnr` VARCHAR(15) NULL,
  `adresse2` VARCHAR(80) NULL,
  `plz` VARCHAR(10) NOT NULL,
  `ort` VARCHAR(80) NOT NULL,
  `land` INT(3) NOT NULL,
  `uid` VARCHAR(30) NULL,
  PRIMARY KEY (`belegnr`),
  CONSTRAINT `bkd_belegnr`
    FOREIGN KEY (`belegnr`)
    REFERENCES `beleg_kopf` (`belegnr`)
    ON DELETE RESTRICT
    ON UPDATE CASCADE
ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS `beleg_positionen` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `belegnr` INT(8) NOT NULL,
  `anzahl` DECIMAL(7,2) UNSIGNED NOT NULL,
  `einheit` VARCHAR(15) NULL,
  `bezeichnung` VARCHAR(200) NOT NULL,
  `preis` DECIMAL(8,2) NOT NULL,
  PRIMARY KEY (`id`),
  INDEX `bpos_belegnr_idx` (`belegnr` ASC),
  CONSTRAINT `bpos_belegnr`
    FOREIGN KEY (`belegnr`)
    REFERENCES `beleg_kopf` (`belegnr`)
    ON DELETE RESTRICT
    ON UPDATE CASCADE)
ENGINE = InnoDB;
@Entity
@Table(name="beleg_kopf")
@SequenceGenerator(name="belegnr", initialValue = 1, allocationSize = 1)
public class BelegKopf implements BaseDTO {
    @Id
    @Column(name="belegnr", nullable = false, length = 8)
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int belegnr;

    @Column(name="auftrag", nullable = false, length = 9)
    private int auftrag;

    @Column(name="typ", nullable = false, length = 2)
    private char typ;

    @Column(name="datum", nullable = false)
    @Temporal(TemporalType.DATE)
    private Date datum;

    @Column(name="payterms", nullable = true, length = 2)
    private int payterms;

    ...
}

@Entity
@Table(name="beleg_kunden")
public class BelegKunde implements BaseDTO {
    @Id
    @Column(name="belegnr", nullable = false, length = 8)
    private int belegnr;

    @Column(name="kdnr", nullable = false, length = 5)
    private int kdnr;

    @Column(name="typ", nullable = false, length = 2)
    private int typ;

    @Column(name="name", nullable = false, length = 80)
    private String name;

    @Column(name="vorname", nullable = true, length = 80)
    private String vorname;

    @Column(name="strasse", nullable = true, length = 80)
    private String strasse;

    @Column(name="hausnr", nullable = true, length = 15)
    private String hausnr;

    @Column(name="adresse2", nullable = true, length = 80)
    private String adresse2;

    @Column(name="plz", nullable = false, length = 10)
    private String plz;

    @Column(name="ort", nullable = false, length = 80)
    private String ort;

    @Column(name="land", nullable = false, length = 3)
    private int land;

    @Column(name="uid", nullable = true, length = 30)
    private String uid;

    ...
}

@Entity
@Table(name="beleg_positionen")
@SequenceGenerator(name="id", initialValue = 1, allocationSize = 1)
public class BelegPosition implements BaseDTO {
    @Id
    @Column(name="id", nullable = false)
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;

    @Column(name="belegnr", nullable = false, length = 8)
    private int belegnr;

    @Column(name="anzahl", nullable = false, length = 7, precision = 2)
    private double anzahl;

    @Column(name="einheit", nullable = true, length = 15)
    private String einheit;

    @Column(name="bezeichnung", nullable = false, length = 200)
    private String bezeichnung;

    @Column(name="preis", nullable = false, length = 8, precision = 2)
    private double preis;

    ...
}
public static void createBeleg(BelegKopf kopf, BelegKunde kunde, List<BelegPosition> pos) throws DatabaseException {
    Session hsession = null;
    Transaction htransaction = null;

    try {
        hsession = HibernateUtil.getSessionFactory().openSession();
        htransaction = hsession.beginTransaction();

        hsession.save(kopf);
        hsession.save(kunde);

        for (BelegPosition p : pos)
            hsession.save(p);

        htransaction.commit();
    } catch (HibernateException ex) {
        if (htransaction != null)
            htransaction.rollback();

        throw new DatabaseException(ex);
    } finally {
        if (hsession != null)
            hsession.close();
    }
}
publicstaticvoidcreatebeleg(BelegKopf-kopf,BelegKunde-kunde,List-pos)抛出DatabaseException{
会话hsession=null;
事务htransaction=null;
试一试{
hsession=HibernateUtil.getSessionFactory().openSession();
htransaction=hsSession.beginTransaction();
hsession.save(kopf);
hsession.save(昆德);
用于(安全带位置p:pos)
hsession.save(p);
htransaction.commit();
}捕获(HibernateeException例外){
if(htransaction!=null)
htransaction.rollback();
抛出新数据库异常(ex);
}最后{
如果(hsSession!=null)
hsession.close();
}
}

这不是Hibernate忘记值已经存在。只是值还没有出现,因为
save()
实际上并没有在表中插入数据。它告诉Hibernate必须在刷新时插入它。因为您从不刷新自己,而且因为您只使用基本列而不定义实体之间的关联,所以Hibernate无法知道插入的执行顺序。使用关联,它会。或者,当您希望确保确实插入了某些内容时,至少调用flush()。此外,kopf的ID应该是自动生成的,但您从未读取它以在引用实体中设置它。在实体类中看不到
BelegKopf
BelegKunde
之间的任何关系。您的模式是由Hibernate生成的吗?或者它是预定义的?@jbnize将DB模式方案设置为预定义的。实体之间没有映射,但我可以在数据库中看到FK约束。@GovindaSakhare您的观点是什么?