Reputation: 340
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 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.
Upvotes: 1
Views: 1756
Reputation: 1097
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.
Upvotes: 2