好的,目录和文件之间存在多对多关系。但是,映射表还包含时间戳 (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/