感谢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 (
的数据库.
表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命名约定
答案 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;