我在删除另一个表引用的记录时遇到问题。
这是一个代码示例(最简单的场景):
@Entity
@Table(name = "user")
public class User
{
@Id
@GeneratedValue(generator="user_id_seq", strategy = GenerationType.SEQUENCE)
@SequenceGenerator(name="user_id_seq", sequenceName="user_id_seq")
@Column(name = "id", nullable = false)
private int id;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "user")
private Set<UserLog> userLogSet;
// Other attributes
// Getters/setters
}
@Entity
@Table(name = "user_log")
public class UserLog
{
@Id
@GeneratedValue(generator="user_log_id_seq", strategy = GenerationType.SEQUENCE)
@SequenceGenerator(name="user_log_id_seq", sequenceName="user_log_id_seq")
@Column(name = "id", nullable = false)
private int id;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "user_id", nullable = false)
private User user;
// Other attributes
// Getters/setters
}
每当我尝试从“user”表中删除记录时,我都会从postgreSQL中收到以下错误:
错误:表“user”上的更新或删除违反了外键 表“user_log”上的约束“fk228a019fd2495d20”
详细信息:键 (id)=(5)仍然从表“user_log”中引用。
我做错了什么?
谢谢!
更新:我尝试编写一个小例子,可以找到here。使用Tomcat启动应用程序后,将自动创建数据库模式(请检查/src/main/webapp/WEB-INF/jdbc.properties中的连接详细信息)。当您访问http://localhost:8080时,会在数据库中插入一些数据。如果我尝试删除teacher
表中引用的任何student
(使用phpPgAdmin),我会收到与上面类似的错误。
答案 0 :(得分:1)
您的映射似乎有误。
用户可以拥有许多用户日志。
同样@OneToMany
应该是一个集合,例如java.util.Set
。
您放置的级联是在UserLog中,如果您对UserLog的实例而不是用户进行操作,则会发生这种情况。
据我所知,改变映射如下。
@Entity
@Table(name = "user")
public class User
{
@Id
@GeneratedValue(generator="user_id_seq", strategy = GenerationType.SEQUENCE)
@SequenceGenerator(name="user_id_seq", sequenceName="user_id_seq")
@Column(name = "id", nullable = false)
private int id;
@OneToMany(cascade = CascadeType.ALL,mappedBy="user")
private Set<UserLog> userLogs;
// Other attributes
// Getters/setters
}
@Entity
@Table(name = "user_log")
public class UserLog
{
@Id
@GeneratedValue(generator="user_log_id_seq", strategy = GenerationType.SEQUENCE)
@SequenceGenerator(name="user_log_id_seq", sequenceName="user_log_id_seq")
@Column(name = "id", nullable = false)
private int id;
@ManyToOne
@JoinColumn(name = "user_id", nullable = false)
private User user;
// Other attributes
// Getters/setters
}
我想你想要删除User及其所有UserLog只是删除User并且离开UserLogs没有意义。
希望这有帮助。
<强>更新强>
在实体类中注释的级联由ORM管理,而不是由您管理 外部尝试从外部工具中删除它们,如phpPgAdmin。
答案 1 :(得分:0)
您的映射错误,OneToMany
应该User
应用于UserLog
的集合。请参阅examples。