JPA级联删除

时间:2012-03-23 17:45:46

标签: spring postgresql jpa

我在删除另一个表引用的记录时遇到问题。

这是一个代码示例(最简单的场景):

@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),我会收到与上面类似的错误。

2 个答案:

答案 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