java - Hibernate多对多映射+连接表更新不起作用

标签 java hibernate many-to-many

好的,目录和文件之间存在多对多关系。但是,映射表还包含时间戳 (dateFound)。所以我创建了四个模型类:

  • 目录
  • 文件
  • 文件目录
  • 文件目录ID

目录类:

...

@OneToMany(fetch = FetchType.EAGER, mappedBy = "pk.directory")
private Set<FileDirectory> fileDirectories;

...

文件类别:

...

@OneToMany(fetch = FetchType.EAGER, mappedBy = "pk.file", cascade=CascadeType.ALL)
private Set<FileDirectory> fileDirectories;

...

文件目录:

...

@AssociationOverrides({

     @AssociationOverride(name = "pk.file", joinColumns = @JoinColumn(name = "fileID")),

     @AssociationOverride(name = "pk.directory", joinColumns = @JoinColumn(name = "directoryID")) })

...

@EmbeddedId
private FileDirectoryID pk = new FileDirectoryID();

...

public void setPK(FileDirectoryID pk) {
    this.pk = pk;
}

public FileDirectoryID getPK() {
    return pk;
}

public void setFile(File file) {
    getPK().setFile(file);
}

public void setDirectory(Directory directory) {
    getPK().setDirectory(directory);
}

...

文件目录ID:

...
@ManyToOne
private File file;

@ManyToOne
private Directory directory;
...

在服务类中,我有以下内容:

public static void updateDirectory(int directoryID, String directoryName,
        String directoryBaseURL, String directorySearchURL, Set<FileDirectory> fileDirectories) {

    Directory directory = (Directory) directoryDAO.get("id", ""
            + directoryID);
    directory.setDirectoryName(directoryName);
    directory.setDirectoryBaseURL(directoryBaseURL);
    directory.setDirectorySearchURL(directorySearchURL);
    directory.getFileDirectories().addAll(fileDirectories);
    directoryDAO.updateObject(directory);
}

此时我可以保证所有字段都具有预期值(包括目录的文件目录映射)

上面调用的 updateObject 具有以下定义:

public void updateObject(DatabaseObject object) {
    Transaction trns = null;
    Session session = HibernateUtil.getSessionFactory().openSession();

    try {
        trns = session.beginTransaction();
        session.update(object);
        session.getTransaction().commit();
    } catch (RuntimeException e) {
        if (trns != null) {
            trns.rollback();
        }

        e.printStackTrace();
    } finally {
        session.flush();
        session.close();
    }
}

所有其他字段均正确更新,但多对多关系未更新。

很抱歉这篇冗长的文章,并提前感谢您。 塞缪尔。

最佳答案

我在这里看不到任何 ManyToMany 关联..? 但是,在您的示例中,目录实体中的 OneToMany 关联 fileDirectories 缺少属性 cascade=CascadeType.ALL 来将持久性传播到关联中。

关于java - Hibernate多对多映射+连接表更新不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22133787/

相关文章:

java - 有没有办法为多个 Runner 类运行的多个功能文件创建一个 Cucumber 报告?

java - 为什么在实体持续存在时设置属性?

spring - 如何在 ubuntu 中使用命令行在后台运行基于 gradle 的 spring boot 应用程序?

java - 如何在 Hibernate 中动态设置@Column 名称

ruby-on-rails - 如何在factory_girl中建立/创建多对多关联?

java - 我的公式注释中的表不存在错误

php - MySQL 多对多具有唯一键和更新/选择如果存在否则插入

java - AsyncSocket延迟发送数据

java - 构造函数抛出异常后可以调用finalize吗?

Java : When a parameter has a value that matches a UTF-8 encoded string in a java HTTPRequestServlet, a doGet 默认对其进行解码