繁体   English   中英

JPA /休眠错误违反外键约束

[英]JPA/hibernate error violation of foreign key constraint

我是hibernat的新手,并且我有两个类,并且试图将数据保存在Derby嵌入式数据库中,但是当我用出售的外键保存类'produto'时,会出现以下错误:错误:

Caused by: ERROR 23503: INSERT on table 'PRODUTOS' caused a violation of foreign key constraint 'FKIOY8UEWC87473SNMMUOPJKUVB' for key (236).  The statement has been rolled back.
    at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)
    at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)
    at org.apache.derby.impl.sql.execute.ForeignKeyRIChecker.doCheck(Unknown Source)
    at org.apache.derby.impl.sql.execute.RISetChecker.doFKCheck(Unknown Source)
    at org.apache.derby.impl.sql.execute.InsertResultSet.normalInsertCore(Unknown Source)
    at org.apache.derby.impl.sql.execute.InsertResultSet.open(Unknown Source)
    at org.apache.derby.impl.sql.GenericPreparedStatement.executeStmt(Unknown Source)
    at org.apache.derby.impl.sql.GenericPreparedStatement.execute(Unknown Source)
    ... 82 more

Venda类别:

@Entity
@Table(name = "Venda")
@Access(value = AccessType.PROPERTY)
public class Venda {

    @Id
    @GeneratedValue
    @Column(name = "venda_id")
    public Long getId() {
        return id;
    }

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = "produtos_id")
    public List<Produtos> getProdutos() {
        return produtos;
    }

    public void setProdutos(List<Produtos> produtos) {
        this.produtos = produtos;
    }

    [...]
}

产品类:

@Entity
@Table(name = "Produtos")
@Access(value = AccessType.PROPERTY)
public class Produtos {       

    @Id
    @GeneratedValue
    @Column(name = "produtos_id")
    public Long getId() {
        return id;
    }


    @ManyToOne(cascade=CascadeType.ALL)
    @JoinColumn(name = "venda_id", nullable = false)
    public Venda getVenda() {
        return venda;
    }

    [...]
}

保存:

EntityManagerFactory factory =   Persistence.createEntityManagerFactory("cliente");
EntityManager manager = factory.createEntityManager();
manager.getTransaction().begin();
manager.persist(venda);
for (Produtos produto : produtos) {
    produto.setVenda(venda);
}
for (Produtos produto : produtos) {

    manager.persist(produto);
}

manager.getTransaction().commit();
manager.close();
factory.close();

除了其他答案:

...违反外键约束'FKIOY8UEWC87473SNMMUOPJKUVB'...

  1. 不知道FKIOY8UEWC87473SNMMUOPJKUVB确切含义,要确定真正的问题并不容易(仅通过阅读代码即可)。
    数据库中可能存在一个约束,该约束已在代码中被删除(后来)。
    您应该首先检查如何定义名为FKIOY8UEWC87473SNMMUOPJKUVB的约束。
  2. 您可以在Hibernate映射文件hbm.xml定义自己的FK名称:

     <many-to-one class="sample.SampleEntity" fetch="select" foreign-key="FK_sampleNameForFK" name="sample"> <column name="sample_id"/> </many-to-one> 

@JoinColumn仅应在关系的一侧指定。 它通常放置在拥有实体的一侧。 在“多对一”和“一对多”双向关系中,通常将其放置在使用@ManyToOne映射的字段上。

因此,我建议删除getProdutos()方法上的@JoinColumn映射。 只需在多面保留一个@JoinColumn

此外,由于这是一种双向的关系,应指定mappedBy的属性@OneToMany注释,以表明这是关系的另一方。

在应用我的建议之后,这是一个示例结果代码:

@Entity
public class Venda {
...

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy="venda")    
    public List<Produtos> getProdutos() {
        return produtos;
    }
...
}

@Entity
public class Produtos {       
...
    @ManyToOne
    @JoinColumn(name = "venda_id", nullable = false)
    public Venda getVenda() {
        return venda;
    }
...
}

您已在Venda实体类中放置了层叠= CascadeType.ALL。 这意味着Produto列表将保存在Venda设置中。 结果,您第二次尝试保存Produto时,由于已经保存了约束违例异常,因此它已被保存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM