簡體   English   中英

休眠多對多映射+聯接表更新不起作用

[英]Hibernate many-to-many mapping + join table update not working

好的,我在目錄和文件之間具有多對多關系。 但是,映射表還包含時間戳記(dateFound)。 因此,我創建了四個模型類:

  • 目錄
  • 文件
  • 文件目錄
  • FileDirectoryID

目錄類別:

...

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

...

FileDirectoryID:

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

到那時,我可以保證所有字段都具有預期值(包括目錄的fileDirectory映射)

上面調用的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關聯。 但是,在您的fileDirectories中,目錄實體中的OneToMany關聯fileDirectories缺少屬性cascade=CascadeType.ALL以將持久性向下傳播。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM