【问题标题】:Why does hibernate remove data from association table?为什么休眠会从关联表中删除数据?
【发布时间】:2023-04-02 16:40:01
【问题描述】:

我的程序中有以下关系:

@Entity
@Table(name = "student")
public class Student extends Person {
    private Map<Document, DocumentInfo> documents =
       new HashMap<Document, DocumentInfo>();
    ...
    @OneToMany
    @JoinTable(name = "student_documents",
            joinColumns = @JoinColumn(name = "student"),
            inverseJoinColumns = @JoinColumn(name = "document_info"))
    @MapKeyJoinColumn(name = "document")
    public Map<Document, DocumentInfo> getDocuments() {
        return documents;
    }
    ...
}

当我用他的文件信息保存学生时,一切似乎都很好.. 当我从数据库中读取他时,一切似乎都很好,但是当我再次尝试读取它时,我遇到了 NullPointerException。我做了一些研究,发现在第一次调用student.getDocuments()时,hibernate会从表student_documents中删除记录:

Hibernate: select document0_.id as id2_0_, document0_.title as title2_0_ from document document0_ where document0_.id=?
Hibernate: select document0_.id as id2_0_, document0_.title as title2_0_ from document document0_ where document0_.id=?
Hibernate: delete from student_documents where student=?

我做错了什么? 谢谢

我的测试代码如下:

    Student student = new Student();
    student.setFirstName("123");
    studentService.add(student);
    Student student2 = studentService.read(student.getId());
    assertFalse(student2.getDocuments().size() == 0); // here it all occurs

服务方式:

public Student add(Student student) {
    for (Document document : documentRepository.findAll()) {
        DocumentInfo documentInfo = new DocumentInfo(false, "");
        documentInfoRepository.save(documentInfo);
        student.getDocuments().put(document, documentInfo);
    }
    return studentRepository.save(student);
}

【问题讨论】:

  • 您是否有可能第一次承诺休眠空documents
  • 假设您正在清除地图或在实体管理的某处为其分配空/空地图。当您对实体进行更改时,它们会转到数据库。它不像 JDBC,除非您明确提交更新/删除,否则事情不会改变。
  • 不,我在写入数据库之前初始化了地图。我在那里写条目,然后我可以看到来自数据库 gui 管理器的记录。然后,当我只调用 getDocuments() (不清除地图或做其他事情)时,我在日志中看到休眠清除我的关联表
  • @Affe 借口,我在第一条消息中添加了我的代码
  • read 是做什么的?您如何管理会话生命周期和事务边界?

标签: java hibernate annotations mapping


【解决方案1】:

好像我刚刚发现了问题。在我的旧项目中现在无法检查,但它与this hibernate bug相关的问题非常相似。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 2011-03-30
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    相关资源
    最近更新 更多