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を使用します