2017-02-23 4 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クラス:

@Entity

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

コード自体に問題はありますか?

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

また、次のようにCASCADEオプションを追加してみてくださいすることができます:あなたは、新しく作成されたFileObjectに使用したユーザ/部門の各エンティティを移入する必要が

答えて

1

@ManyToMany(mappedBy="fileHasAccess", cascade = {CascadeType.PERSIST, CascadeType.MERGE}) 
+0

私は存続する必要がありますユーザーと部門も同様ですか?また、カスケードはfileobjectクラスにのみ適用されますか? –

+0

カスケードを使用する場合、あらかじめそれらを永続化する必要はありません。それらはFileObjectとともに永続化されます。 –

関連する問題