无法添加或更新子行:外键约束失败Hibernate

时间:2015-04-21 08:31:39

标签: java hibernate spring-mvc

解决

感谢Predrag Maric我设法找到了一个bug,其中referencedColumnName没有引用正确的字段。然后我不得不让Table2类实现Serializable接口,这使我的测试通过

感谢您的帮助

问题

如何在Hibernate中映射Table3?

enter image description here

这是我的尝试:

@Entity
@Table(name="Table3")
public class Table3 implements Serializable
{
    @Id
    @GeneratedValue
    private long id;

    @NotNull
    @Column(name="field1")
    private String field1;

    @NotNull
    @Column(name="field2")
    private String field2;

    @ManyToOne
    @JoinColumn(name="Table2_id")
    private Table2 Table2_id ;

    @ManyToOne
    @JoinColumn(name="Table2_Table1_username")
    private Table2 Table2_Table1_username;

错误发生在我的JUnit测试中:

Cannot add or update a child row: a foreign key constraint fails (的数据库.表3 , CONSTRAINT fk_Table3_Table2 FOREIGN KEY ( Table2_id , Table2_Table1_username ) REFERENCES表2 ( ID为, Table1_username ) ON DELETE NO ACTION ON UPDATE NO ACTION)

构造

Table3(String field1, String field2, Table2 table)
{
    this.field1 = field1;
    this.field2 = field2;
    this.Table2_id = table;
    this.Table2_Table1_username = table;
} 

JUnit测试

@Before
    public void init() 
    {
        JdbcTemplate jdbc = new JdbcTemplate(dataSource);
        jdbc.execute("DELETE FROM Table3");
        jdbc.execute("DELETE FROM Table2");
        jdbc.execute("DELETE FROM Table1");
    }
 @Test
    public void testCreateMedia()
    {
        table1DAO.createTable(table1Object);
        table2DAO.createTable(table2Object);
        table3DAO.createTable(table3Object); //fails here
    }

注意到: 我没有使用变量的java命名约定

1 个答案:

答案 0 :(得分:3)

我认为您误解了name中的referencedColumnName@JoinColumn

name是源(Table3)表中列的名称,它是目标(Table2)表的外键。

referencedColumnName是目标表中列的名称,它是主键(Table2.id)。在大多数情况下,可以省略此属性。

在你的情况下,它应该看起来像这样

@ManyToOne
@JoinColumn(name="Table2_id")
private Table2 Table2_id ;

@ManyToOne
@JoinColumn(name="Table2_Table1_username")
private Table2 Table2_Table1_username;