[英]No new entry in join table of many to many relationship JPA
我試圖保留文件對象的新條目,該文件對象具有用戶和部門之間的多對多關系(在這種情況下,許多用戶/部門可以訪問文件),但是在保留信息之后,user_fileobject和dept_fileobject的聯接表中未反映出來。 持久化本身以及用戶和部門的實例化列表位於不同的類上,但是這些列表是否也需要持久化嗎?
以下是實例化用戶和部門列表的代碼:
for(int i=0; i<listSharee.length; i++){
String username = listSharee[i].replace(" ", ".").toLowerCase();
Query q1 = CpabeDAO.em.createQuery("SELECT u FROM User u WHERE u.username=:username");
q1.setParameter("username", username);
List<User> userReq = q1.getResultList();
if(userReq.isEmpty()){
Query q3 = CpabeDAO.em.createQuery("SELECT d FROM Department d WHERE d.departmentName=:name");
q3.setParameter("name", listSharee[i]);
List<Department> departmentReq = q3.getResultList();
for(Department dept : departmentReq){
listSharee[i] = listSharee[i].replace(" ", "");
departmentSharee.add(dept);
}
}else{
for(User user: userReq){
userSharee.add(user);
listSharee[i] = listSharee[i].replace(" ", "_");
}
}
}
...
FileUpload.uploadFile(file, totalPolicy, userLoggedIn, userSharee, departmentSharee);
這是用於持久保存文件對象信息的代碼:
public static void storeFileInformation(byte[] encryptedRawFileKey, String fileChecksum, String fileKeyChecksum, byte[] ivFileKey, String keyName, String realName, String policy, User owner, List<User> userSharee, List<Department> departmentSharee ){
// byte[] encryptedRawFileKey, String fileChecksum, String fileKeyChecksum, byte[] ivFileKey, String keyName, List<User> listUserAccessor, List<Policy> policies, String realName, User userCreator
CpabeDAO.em.getTransaction().begin();
FileObject fileObject = new FileObject();
fileObject.setEncryptedRawFileKey(encryptedRawFileKey);
fileObject.setFileChecksum(fileChecksum);
fileObject.setFileKeyChecksum(fileKeyChecksum);
fileObject.setIvFileKey(ivFileKey);
fileObject.setKeyName(keyName);
fileObject.setPolicy(policy);
fileObject.setRealName(realName);
fileObject.setListDeptAccessor(departmentSharee);
fileObject.setListUserAccessor(userSharee);
fileObject.setUserCreator(owner);
CpabeDAO.em.persist(fileObject);
CpabeDAO.em.getTransaction().commit();
CpabeDAO.em.close();
}
這是User,Department和FileObject類的POJO:
@實體
public class User {
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
public int id;
public String username;
public String firstname;
public String lastname;
// public String attributes;
public String hashPassword;
@ManyToOne
private Department department;
@OneToMany(mappedBy = "user")
public List<Device> devices = new ArrayList<Device>();
@OneToMany(mappedBy = "userCreator")
public List <FileObject> fileOwned = new ArrayList <FileObject>();
@ManyToMany
@JoinTable(name="USER_FILE_ACCESS",
joinColumns=@JoinColumn(name="user_id"),
inverseJoinColumns=@JoinColumn(name="fileHasAccess_ID "))
public List<FileObject> fileHasAccess = new ArrayList<FileObject>();
}
@Entity
public class Department {
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
int departmentId;
String departmentName;
@OneToMany(mappedBy = "department")
private List<User> employees = new ArrayList<User>();
@ManyToMany
@JoinTable(name="DEPT_FILE_ACCESS",
joinColumns=@JoinColumn(name="dept_id"),
inverseJoinColumns=@JoinColumn(name="fileHasAccess_ID "))
public List<FileObject> deptFileHasAccess = new ArrayList<FileObject>();
}
@Entity
public class FileObject {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
public int id;
String fileChecksum;
String fileKeyChecksum;
String realName;
String keyName;
// @OneToMany(mappedBy = "fileObject")
// public List<Policy> policies = new ArrayList<Policy>();
String policy;
byte[] encryptedRawFileKey;
byte[] ivFileKey;
@ManyToOne
public User userCreator;
@ManyToMany(mappedBy="fileHasAccess")
public List<User> listUserAccessor = new ArrayList<User>();
@ManyToMany(mappedBy="deptFileHasAccess")
public List<Department> listDeptAccessor = new ArrayList<Department>();
}
代碼本身有問題嗎?
您必須使用新創建的FileObject填充每個User / Department實體:
fileObject.setRealName(realName);
fileObject.setListDeptAccessor(departmentSharee);
fileObject.setListUserAccessor(userSharee);
fileObject.setUserCreator(owner);
for(Department dep: departmentSharee){
dep.getFileHasAccess().add(fileObject);
}
for(User user: userSharee){
user.getDeptFileHasAccess().add(fileObject);
}
您也可以嘗試添加級聯選項,如下所示:
@ManyToMany(mappedBy="fileHasAccess", cascade = {CascadeType.PERSIST, CascadeType.MERGE})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.