簡體   English   中英

多對多關系JPA的聯接表中沒有新條目

[英]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.

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