Java 为什么hibernate从关联表中删除数据?

Java 为什么hibernate从关联表中删除数据?,java,hibernate,annotations,mapping,Java,Hibernate,Annotations,Mapping,我在我的计划中有以下关系: @Entity @Table(name = "student") public class Student extends Person { private Map<Document, DocumentInfo> documents = new HashMap<Document, DocumentInfo>(); ... @OneToMany @JoinTable(name = "student_d

我在我的计划中有以下关系:

@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;
    }
    ...
}
我做错了什么? 谢谢

我的测试代码如下所示:

    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);
}

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

是否有可能第一次提交休眠空文档?可以想象您正在清除映射或将null/空映射分配给实体管理的某个位置。当您对实体进行更改时,这些更改将转到数据库。这和JDBC不同,在JDBC中,除非显式提交更新/删除,否则不会更改内容。不,我在写入数据库之前初始化映射。我在那里写条目,然后我可以从数据库gui管理器中看到记录。然后,当我只调用getDocuments而不清除映射时,或者当我在日志中看到hibernate清除我的关联时table@Affe对不起,我在第一条消息中添加了我的代码read做什么?您如何管理会话生命周期和事务边界?
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);
}