JPA(六)多対多

8527 ワード

1.多対多エンティティクラスの構成
@Entity
@Table(name = "role")
public class Role {

    @Id
    @Column(name = "role_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long roleId;

    @Column(name = "role_name")
    private String roleName;

    @ManyToMany(cascade=CascadeType.ALL)
    @JoinTable(name = "user_role", joinColumns = {@JoinColumn(name = "rid",referencedColumnName="role_id")}, 
                            inverseJoinColumns = {@JoinColumn(name = "uid",referencedColumnName="user_id")})
    private Set userList = new HashSet<>();
}   
@Entity
@Table(name = "users")
public class Users {

    @Id
    @Column(name = "user_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long userId;
    @Column(name = "user_name")
    private String userName;
    @Column(name = "user_address")
    private String address;
    @Column(name = "user_gender")
    private String gender;

    @ManyToMany(cascade=CascadeType.ALL,mappedBy="userList")
    private Set roles = new HashSet<>(0);
}

2、注釈説明
-@ManyToManyの役割:マルチペアのマルチリレーションシップ属性をマッピングするために使用されます:cascade:カスケード操作を構成します.fetch:遅延ロードを使用するかどうかを構成します.targetEntity:ターゲットのエンティティクラスを構成します.マッピングが多対多の場合は書かなくてもいいです.
  • @JoinTable役割:中間テーブルの構成プロパティ:name:中間テーブルの名前joinColumnsの構成:中間テーブルの外部キーフィールド現在のエンティティークラスに対応するテーブルを関連付けるプライマリ・キーフィールドinverseJoinColumn:中間テーブルの外部キーフィールド相手テーブルを関連付けるプライマリ・キー・セグメント-@JoinColumn役割:プライマリ・キーフィールドと外部キーの定義フィールドの対応関係.属性:name:外部キーフィールドの名前referencedColumnNameを指定:プライマリ・テーブルを参照するプライマリ・キーフィールド名uniqueを指定します:一意かどうか.デフォルト値がユニークではないnullable:空に許可されているかどうか.デフォルトでは許可されています.insertable:挿入を許可するかどうか.デフォルトでは許可されています.updatable:更新を許可するかどうか.デフォルトでは許可されています.columnDefinition:カラムの定義情報.

  • 3テスト
    3.1、保存
        /**
         * 
         * 1、      
         */
        @Test
        public void testAdd() {
            //     
            Role role1 = new Role();
            Role role2 = new Role();
            Users users1 = new Users();
            Users users2 = new Users();
    
    
            role1.setRoleName("  1");
            role1.getUserList().add(users1);
            role1.getUserList().add(users2);
    
            role2.setRoleName("  2");
            role2.getUserList().add(users2);
    
            users1.setAddress("  ");
            users1.setGender(" ");
            users1.setUserName("  ");
            users1.getRoles().add(role1);
    
            users2.setAddress("  ");
            users2.setGender(" ");
            users2.setUserName("  ");
            users2.getRoles().add(role1);
            users2.getRoles().add(role2);
    
            EntityManager em = null;
            EntityTransaction tx = null;
            try {
                //         
                em = JpaUtil.getEntityManager();
                //       
                tx = em.getTransaction();
                //     
                tx.begin();
                //     
    
                em.persist(role1);
    
                //     
                tx.commit();
            } catch (Exception e) {
                //     
                tx.rollback();
                e.printStackTrace();
            } finally {
                //     
                em.close();
            }
        }
        (  ) ,         ,           ,          ,     2
              ,    ,    ,         :                   
     ,          ,    :
    @ManyToMany(mappedBy="roles")
    private Set users = new HashSet(0);

    3.2削除
         /**
            *     
            *       :        。
            *       :
            *        
            * 1、    
            * 2、      ,      
            *         :   
            *
            *       ,       !(        )
            */
        @Test
        public void testRemove() {
            //     
            EntityManager em = null;
            EntityTransaction tx = null;
            try {
                //         
                em = JpaUtil.getEntityManager();
                //       
                tx = em.getTransaction();
                //     
                tx.begin();
                //     
                Users u = em.find(Users.class, 2L);
    
                em.remove(u);
                //     
                tx.commit();
    
            } catch (Exception e) {
                //     
                tx.rollback();
                e.printStackTrace();
            } finally {
                //     
                em.close();
            }
        }
    
    @OneToMany(targetEntity=LinkMan.class,mappedBy="customer",cascade=CascadeType.AL
    L) //  CascadeType.REMOVE    
    private Set linkmans = new HashSet(0);