Question

Okay, so I have a Many-to-Many relationship between Directory and File. However, the mapping table also contains a timestamp (dateFound). So I've created four model classes:

  • Directory
  • File
  • FileDirectory
  • FileDirectoryID

Directory Class:

...

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

...

File Class:

...

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

...

FileDirectory:

...

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

In a service class, I have the following:

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

I can guarantee at that point, that all the fields have the expected values (including directory's fileDirectory mapping)

The updateObject called above has the following definition:

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

All of the other fields update correctly, but the many-to-many relations do not update.

Sorry for the long-winded post, and thank you in advance. Samuel.

Was it helpful?

Solution

I can't see any ManyToMany association here.. ? However in your exemple, the OneToMany association fileDirectories in Directory entity is missing attribute cascade=CascadeType.ALL to propagate the persistence down the association.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top