2015-10-19 91 views
1

我是新来的hibernat,我有两个类,我试图将数据保存在Derby嵌入式数据库中,但是当我用外键保存类'produto'时从销售出现以下错误: 错误:JPA /休眠错误违反外键约束

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 

类文达:

@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; 
    } 

类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(); 

请有人能帮助我吗?

回答

1

@JoinColumn应该只在关系的一边指定。它通常放在拥有实体的一侧。在多对一和一对多的双向关系中,这通常放在与@ManyToOne映射的字段上。

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

此外,由于这是双向关系,因此您应该在@OneToMany注释中指定mappedBy属性,以表明这是关系的反面。

下面是一个示例生成的代码,将我的建议后:

@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; 
    } 
... 
} 
+0

我改变了代码,并没有工作,然后删除银行,并运行它的工作后,谢谢你 – user3576248

0

您已将级联= CascadeType.ALL放入文达实体类中。这意味着Produto列表保存在文达设置。因此,第二次尝试保存Produto会给您提供约束违规异常,因为它已被保存。

+0

我尝试起飞casCadeType.ALL,但给出相同的错误,我尝试删除数据库并运行应用程序,但给我同样的错误 – user3576248

2

除了其他的答案:

...violation of foreign key constraint 'FKIOY8UEWC87473SNMMUOPJKUVB'...

  1. 不知道什么'FKIOY8UEWC87473SNMMUOPJKUVB'确切指的是, 它不容易识别问题(仅限于通过阅读你的代码)。
    也许可能存在数据库中的约束,该约束在代码中被删除(稍后)。

    您应该首先检查约束(名为:'FKIOY8UEWC87473SNMMUOPJKUVB')是如何定义的。
  2. 您可以定义自己的FK-的名字,如: <many-to-one class="sample.SampleEntity" fetch="select" foreign-key="FK_sampleNameForFK" name="sample"> <column name="sample_id"/> </many-to-one>

干杯。

+0

你在哪里可以定义fk名字? persistance.xml不支持这一点。 – telebog

+0

我利用hbm。xml文件 – Ben

+0

这个hbm.xml是什么? – telebog