使用休眠保存

Posted

技术标签:

【中文标题】使用休眠保存【英文标题】:Saving with hibernate 【发布时间】:2021-09-22 01:18:20 【问题描述】:

我是 hibernate 的新手,正在尝试使用它。但是,我面临一个小问题。所以我有一种按摩应用程序,用户可以在这里互相发送消息。这是用户和按摩类:

@Entity(name = "userPojo")
public class User 

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String firstName;
    private String lastName;
    @Column(unique = true)
    private String username;
    private String password;
    @OneToMany(cascade = CascadeType.REMOVE)
    @JoinTable(name = "user_messages")
    @LazyCollection(LazyCollectionOption.FALSE)
    private final List<Message> messages = new LinkedList<>();

    // constructor and getters&setters



@Entity
public class Message 

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int ID;
    private String message;
    private String dateTime;
    @ManyToOne
    private User sender;

    // constructor and getters&setters
    

现在,如果消息的发件人想要删除他的一条消息,我将面临以下异常:

Caused by: org.postgresql.util.PSQLException: ERROR: update or delete on table "message" violates foreign key constraint "fkdqkq2exjkook6o3vx26kxnnya" on table "user_messages"
  Detail: Key (id)=(2) is still referenced from table "user_messages".

感谢您帮助解决此错误

【问题讨论】:

还提供从数据库加载记录并执行删除的其余代码。另外,Message 不应该有两个用户(作者和收件人)吗? 实际上,每个用户拥有的消息列表是他们保存的消息。为了保留您正在谈论的数据,我有一个我不想在这里提及的现场聊天。问题是我必须先将消息保存到数据库然后用户@MartinDendis 【参考方案1】:

我相信您面临的是映射问题,您是说一条消息应该有多个用户而不是属于一个用户?尝试的一些替代方法是从 Message 中删除 ManyToOne 或使用“mappedBy”注释属性来指定此时未知的关系所有者(Message x User)。之后,从父集合中删除所需的项目 + 保存应该可以解决问题。

This tutorial may also shed some light

【讨论】:

以上是关于使用休眠保存的主要内容,如果未能解决你的问题,请参考以下文章

如何在休眠中保存多个表

将对象保存到数据库时使用休眠

休眠保存或更新行为

休眠保存实体

在保存休眠实体时忽略瞬态模式

休眠中的保存方法不立即插入