単方向多対多の双方向双方向多対多の個々の単一一対一の双方向

1片道対多

1.1の設定

マルチコンフィギュレーション

 //交给jpa管理
@Entity
//创建的表名
@Table(name="t_product")
public class Product {   
    @Id    
    @GeneratedValue   
    private Long id;   
    private String name;
}

1つの平方設定

@Entity
@Table(name="t_productDir")
public class ProductDir {
    @Id
    @GeneratedValue
    private Long id;
    private  String name;
    //泛型必须添加进去否则报错必须配置外键id,否则会多生成一张表,形成多对多的关系  
    @OneToMany
    @JoinColumn(name="dir_id")
    private Set<Product> products = new HashSet<>();
 }

1.2 保存

パフォーマンスは、多くのように一つにならないよう、追加のSQLでの送信を救うどんなに
理由は、当事者が余分な処理更新ステートメントを与える必要があり、今の当事者によって処理されている外部キーであります

1.3クエリ

遅延ロード

//现在使用 Set集合 HashSet 打印出来 PersistentSet  
//PersistentSet 它是Set的实现类 和 HashSet一样 ,PersistentSet 和 HashSet都是
//Set的实现类,是兄弟关系 --在定义实体的集合的时候,不要定义HashSet
//PersistentBag 也是 List的实现类,和ArrayList一样,ArrayList和PersistentBag都是
//List的实现 ,是兄弟关系 --在定义实体的集合的时候,不要定义ArrayList

要約:時間ときエンティティ・クラスの定義において、コレクションは、インターフェース方式のセットを使用する場合

1.4コレクション

今ときに定義されたセット、どのような状況下での設定を使用し、どのような状況の下でリストを使うのか?

一覧/設定の違いは?

リストは、順序付けられたシーケンスで設定の自由を繰り返すことができ、繰り返すことはできません

で設定し、一般的な使用の多対多

一般的に、一般的に組み合わせて使用​​したドキュメント上記一覧

ORDERBYコレクションをソート1.5

コンフィギュレーション

@OneToMany
@JoinColumn(name = "dir_id")
@OrderBy("price DESC")       
private List<ProductSet> products = new ArrayList<ProductSet>();  = new HashSet<ProductSet>(); 

2双方向対多または多

設定:可能な限りとして、当事者間の関係を維持するために、管理mappedByを放棄パーティー

    @OneToMany(mappedBy = "dir")
    private List<Product> products = new ArrayList<>();

双方向対多のクエリ注:

@Test
 // 单项一对多查询就是你查询一方的时候可以 同时可以查询到他对应的多方
            // 若是查询 多方的话就无法查询到一方
        public void testns()throws  Exception{
        /*  若是双向一对多查询  则你查询出来不能直接打印  
        双向多对多是你中有我我中有你的关系  多方里面同时保存了一方的值 
         若是你直接 打印多方或者一方的值 他就会掉用 tostring方法 的同时使懒加载失效
          疯狂重复查询然后报错 所一需要掉用方法来查看值
          System.out.println(student.getDir().getName());

*/
         EntityManager manager = Util.getEntityManager();
            Student student = manager.find(Student.class, 4L);
           
            //String name = student.getName();
            System.out.println(student.getDir().getName());
           // System.out.println(student.getName());



カスケード2.1保存

カスケード:データも一緒にマルチ動作できるが、私は、データのいずれかを操作すること

(DIR)持続します。

カスケードは、に分かれています。カスケードが保存されてDELETE CASCADE

@OneToMany(カスケード= CascadeType.PRESIST)

2.2カスケードは慎重に削除されます

@OneToMany(cascade = CascadeType.REMOVE)

2.3削除孤児

あなたはマルチパーティ1から取り外すことができ、当事者が関係を持ち上げるようにしましょう

cascade = CascadeType.REMOVE  级联删除
mappedBy = "dir"       放弃管理
 orphanRemoval = true   孤儿删除
@OneToMany(cascade = CascadeType.REMOVE,mappedBy = "dir",orphanRemoval = true)

カスケードの関係で使用される2.4の強いシーン組成物(ドキュメント)

代表者は照会およびカスケードカスケード削除することができます
@OneToMany(カスケード= CascadeType.ALL)

3ウェイ、多くの

3.1ウェイ、多くの設定

多くの多くの

ユーザーとロール

ユーザーは、このような監督と俳優胡歌(フー・ゴー)など複数の役割を持つことができます

役割は持っているエディ趙麗穎を、このような俳優胡歌の役割など、複数のユーザーを持つことができます

ユーザーベース

@Entity
@Table(name="t_user")
public class User {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    // 表示多对多
    @ManyToMany  
               // 中间表的表名                     ueser 的外键
    @JoinTable(name="t_user_role",joinColumns={@JoinColumn(name="user_id")},
            //反转  user这个表的 反面则是 role
            inverseJoinColumns ={@JoinColumn(name="role_id")} )
    private Set<Role> roles = new HashSet<>();
}

役割

@Entity
@Table(name="t_role")
public class Role {   
    @Id  
   @GeneratedValue    
    private Long id;    
    private String name;
}

データを保存する3.2マルチウェイ

コードの保存

      //3个用户 2个角色
        User user1 = new User();
        user1.setName("渣渣辉");

        User user2 = new User();
        user2.setName("光头强");

        User user3 = new User();
        user3.setName("王天霸");
        Role role1 = new Role();
        role1.setName("演员");
        Role role2 = new Role();
        role2.setName("导演");

        //设置关系
        user1.getRoles().add(role1);
        user2.getRoles().add(role1);
        user3.getRoles().add(role1);
        user1.getRoles().add(role2);
        user2.getRoles().add(role2);

        //保存数据
        EntityManager entityManager = JpaUtils.getEntityManager();
        entityManager.getTransaction().begin();
        entityManager.persist(user1);
        entityManager.persist(user2);
        entityManager.persist(user3);
        entityManager.persist(role1);
        entityManager.persist(role2);

        entityManager.getTransaction().commit();

クエリ:自分の怠惰を設定することができますが、遅延ロードを使用している場合

4 - 多くの双方向

4.1構成

このパーティの役割

@ManyToMany(fetch = FetchType.LAZY,cascade = CascadeType.REMOVE)
    @JoinTable(name="t_user_role",joinColumns={@JoinColumn(name="role_id")},
            inverseJoinColumns ={@JoinColumn(name="user_id")} )
    private Set<User> users = new HashSet<>();

このユーザ側

 @ManyToMany(fetch = FetchType.LAZY,cascade = CascadeType.REMOVE)
    @JoinTable(name="t_user_role",joinColumns={@JoinColumn(name="user_id")},
            inverseJoinColumns ={@JoinColumn(name="role_id")} )
    private Set<Role> roles = new HashSet<>();

4.2オペレーティング

(1)カスケードは保存します。

ユーザー設定カスケード保存

/*  当你 设置好关系后 直接保存一方 就等于也保存了另外一方(底层实现)
*/
   EntityManager entityManager = JpaUtils.getEntityManager();
        entityManager.getTransaction().begin();
        entityManager.persist(user1);
        entityManager.persist(user2);
        entityManager.persist(user3);

        entityManager.getTransaction().commit();

(2)は、強力なカスケードまたはカスケード削除を持たない役割の設定を削除します

 //保存数据
 EntityManager entityManager = JpaUtils.getEntityManager();
 //查询到一个角色
 User user = entityManager.find(User.class, 1L);
 entityManager.getTransaction().begin();
 // 直接删除这个角色
 entityManager.remove(user);
 entityManager.getTransaction().commit();

(3)は、user1は(唯一のテーブルの真ん中を削除)この役割を削除することはできませんすべてのuser1が役割(ROLE1、role2の)を含ん削除
設定されていないか、強いケースをカスケード接続するカスケード削除します

//保存数据
EntityManager entityManager = JpaUtils.getEntityManager();
//查询到一个角色
User user = entityManager.find(User.class, 1L);
entityManager.getTransaction().begin();
// 直接得到这个用户所有的角色 然后清除所有 
user.getRoles().clear();
entityManager.getTransaction().commit();

(4)は、user1が(テーブルの真ん中だけを削除)削除することはできません、役割USER1を削除する
ように構成されていないか、強いケースをカスケード接続するカスケード削除します

 //保存数据
 EntityManager entityManager = JpaUtils.getEntityManager();
 // 查询到一个用户
 User user1 = entityManager.find(User.class, 1L);
 // 查询到指定角色信息
 Role role1 = entityManager.find(Role.class, 1L);
 entityManager.getTransaction().begin();
 // 得到这个用户的所有的角色信息  然后删除指定的角色信息
 user1.getRoles().remove(role1);
 entityManager.getTransaction().commit();

ユーザの役割の追加(5)を削除ユーザーロール3 1 2 3

 @Test
    public void testDelete4()throws Exception{
        //保存数据
        EntityManager entityManager = JpaUtils.getEntityManager();
        User user3 = entityManager.find(User.class, 3L);
        Role role1 = entityManager.find(Role.class, 1L);
        Role role2 = entityManager.find(Role.class, 2L);
        entityManager.getTransaction().begin();
        user3.getRoles().remove(role1);
        user3.getRoles().add(role2);
        entityManager.getTransaction().commit();
    }

(5)コンフィギュレーションカスケード削除カスケード削除パーティー

コンフィギュレーション

   @ManyToMany(fetch = FetchType.LAZY,cascade = CascadeType.REMOVE)
    @JoinTable(name="t_user_role",joinColumns={@JoinColumn(name="user_id")},
            inverseJoinColumns ={@JoinColumn(name="role_id")} )

コード:関連付けられている役割は、関連するデータがテーブルの真ん中に削除削除削除USER3

 @Test
    public void testDelete5()throws Exception{
        //保存数据
        EntityManager entityManager = JpaUtils.getEntityManager();
        User user3 = entityManager.find(User.class, 3L);
        entityManager.getTransaction().begin();
        entityManager.remove(user3);
        entityManager.getTransaction().commit();

    }

5-1

1対多または多できる特殊なケースとして見ること

シーン1:

QQとQQZone

1以上の代わりの1の一般的な使用に設定背中を理解していません

キーの構成:

(1)は、単方向多対多の一方向の使用はお勧めしません。

(2)あなたがそう放棄管理という、双方向の構成を使用しようとすると、複数のペアを使用している場合

(3)設定の一方向動作場合一方向互いに双方向で多数のコンフィギュレーションデータに多くを得るために

(4)の代わりに、ユニークな方法で1を使用するための外部キーである場合、多対1を使用します

公開された23元の記事 ウォンの賞賛2 ビュー939

おすすめ

転載: blog.csdn.net/metjoyful/article/details/101112581