【问题标题】:Cannot add or update a child row: a foreign key constraint fails Hibernate无法添加或更新子行:外键约束 Hibernate 失败
【发布时间】:2015-04-21 18:47:06
【问题描述】:

已解决

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

感谢您的帮助

问题

如何在 Hibernate 中映射 Table3?

这是我的尝试:

@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 (database.Table3, CONSTRAINTfk_Table3_Table2FOREIGN KEY (Table2_id,Table2_Table1_username) REFERENCESTable2(id,Table1_username@978

构造函数:

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 命名约定

【问题讨论】:

  • 嗯,它有效吗?这里有什么问题?
  • @Kayaman 请查看我更新的问题:)

标签: java hibernate spring-mvc


【解决方案1】:

我认为你误解了@JoinColumn 中的namereferencedColumnName

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;

【讨论】:

  • 这有点帮助,但我的问题仍然存在。请查看我更新的问题
  • 非常感谢,我按照上面的说明解决了我的问题
猜你喜欢
  • 2011-08-03
  • 1970-01-01
  • 2020-10-04
相关资源
最近更新 更多