0

我有一个 OneToMany 关系,我可以插入记录但不能删除它们,当我尝试删除它时会遇到“外键约束失败”错误。我已经使用以下级联删除孤儿,但还没有工作。

父类的成员具有以下 getter

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.OneToMany;

@Entity
@DynamicUpdate
public class User extends Employee{
    private string userli;
    privae List<Message> messagelist();

    .....

    @OneToMany(fetch = FetchType.LAZY,cascade = CascadeType.REMOVE)
    public List<Message> getMessagelist() {
        return messagelist;
    }

成员类的父类具有以下 getter

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
 ......  

   @ManyToOne
   public User getReciever() {
        return reciever;
   }

我也使用了以下注释但没有用

     @Cascade(org.hibernate.annotations.CascadeType.DELETE)

我的休眠依赖如下

 <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>4.2.1.Final</version>
    <type>jar</type>
</dependency>

我删除消息的代码

            Message message = (Message) session.get(Message.class, id);
            session.delete(message);
            tx.commit();
4

3 回答 3

1
Try to change the cascade = cascadeType.ALL 

and check

    @OneToMany(fetch = FetchType.LAZY,cascade = CascadeType.ALL)
    public List<Message> getMessagelist() {
            return messagelist;

It might work but not sure 
于 2013-07-31T02:40:44.380 回答
1

有几种方法可以处理 OneToMany 关系。最常见的方法之一是:

@OneToMany(mappedBy="receiver", CascadeType.REMOVE)
public List<Message> getMessagelist() {
        return messagelist;
}

....

@ManyToOne
public User getReciever() {
        return reciever;
}

请注意, fetch = FetchType.LAZY 是默认值,您实际上不需要指定它。

此外,您可能需要重新创建表,因为已经创建了 db 约束。在这种情况下,不要 100% 信任 hbm2ddl.auto=update。我建议删除相关表(Message、Reciver 和 Receiver_Message 或 Message_Receiver)。接下来,您可以使用 hbm2ddl.auto=update。

我希望它有所帮助。

干杯

于 2013-07-31T03:46:33.540 回答
0

尝试添加以下注释。它对我有用。

@OneToMany(mappedBy="receiver", cascade=CascadeType.ALL, fetch=FetchType.LAZY)  
@Cascade(value=org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
 public Set<Message> getMessagelist() {
    return messagelist;
}

我正在使用实体管理器删除方法,它对我有用。在我看来,我使用的是 Set 而不是 List,这是一种有效的方式。

删除孤儿注解只是为了告诉休眠,如果“我从 MessageList 中删除实体并尝试合并用户,那么你可以安全地删除消息”

@Cascade(value=org.hibernate.annotations.CascadeType.DELETE_ORPHAN) 
于 2014-07-17T06:37:59.827 回答