2017-02-23 49 views
0

我试图坚持文件对象的新条目,该条目在用户和部门之间具有多对多关系(许多用户/部门可以在此场景中访问文件) user_fileobject和dept_fileobject的连接表中的信息未反映出来。坚持自己,用户和部门的实例化列表在不同的类中,但是这些列表是否也需要被持久化?在多对多关系连接表中没有新条目JPA

这里有实例的用户和部门的名单代码:

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

下面是用户的POJO, Department和FileObject类:

@实体

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", 
    [email protected](name="user_id"), 
     [email protected](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", 
    [email protected](name="dept_id"), 
     [email protected](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>(); 
} 

代码本身有问题吗?

回答

1

你必须与新创建的文件对象来填充每个用户/部门实体:

 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}) 
+0

做我需要坚持的用户和部门呢?也只是应用于fileobject类的级联? –

+0

如果你使用级联,那么你不需要事先保存它们。它们将与FileObject一起被保存。 –

相关问题