:主キーは何ですか
1がヌルにすることはできませんのみ、
2を一意に識別は(各行の他のキーと区別します)
主要なカテゴリー:
代理の主キー:
- 主キーとして使用するカラム議論の余地(IDなど)
自然主キー:
- カラムとして(名前のような)主キーの具体的な実用的な意義を使用
主キーの生成方法
若是交给了jpa主键策略@GeneratedValue 在保存数据的时候就不需要设置该主键的值了因为这个值已经交给jap进行维护了
@GeneratedValue(strategy=GenerationType.AUTO)
自己会根据你的配置的方言 来选择使用的生成策略 -- 主键自增(mysql) --序列(oracle)
@GeneratedValue (strategy = GenerationType.IDENTITY)
主键由数据库自动生成(主要是自动增长型)
@GeneratedValue (strategy = GenerationType.SEQUENCE)
序列 mysql不支持 但是oracle支持序列
@GeneratedValue(strategy = GenerationType.TABLE)
表的策略 兼容好 可以mysql 支持oracle 性能有点低() 使用一个特定的数据库表格来保存主键。
JPAエンティティオブジェクトの状態:
瞬時状態:
ちょうど(新しい)のうちに作成され、EntityManagerのない関係(一時オブジェクトの一部は)
ステータスを開催しました:
すでにentityManger関係(追加や削除は、メソッドを呼び出すためにするとき)の関係がEntityManagerの発生したキャッシュに追加された持続しました(キャッシュフィルのための)
自由状態で:
すでに実体関係がなく、EntityManagerのでは、持続した出発。(類似の解体に)
削除状態を
私たちは、コンテンツ削除この状態は唯一のID、およびEntityManagerの管理に関連するオブジェクトのentityManager.remove(ドメインオブジェクト)法と呼ばれるが、削除されるようにスケジュールされているを削除したい場合は、トランザクションが実際に提出されますこれは、削除されました。
ダーティデータ更新:
汚いとは何か:
- システム・データ・ソースは、実際のトラフィックまたは無意味な、または不正なデータ形式、ソースシステムにおける非標準曖昧コードとビジネスロジックの存在範囲を与えられていないことをいいます。
- トランザクションがデータにアクセスしている時に人気の話があり、データが変更されており、この変更はデータベースに提出されていない、そして、他のトランザクションは、データにアクセスし、このデータを使用しています。データはまだコミットされていないので、このデータは、その後、他のトランザクションは、このデータがダーティデータで読むダーティデータが誤っていると、操作を行ってもよいです。
ダーティデータ更新:
あなたは、主キーの値を変更した場合のn対nの問題がエラーになり
ますが、コミット時における非プライマリキーの値を変更した場合、データを永続的な状態を自動的に更新文の更新を送信します
コードは反映します
@Test
public void test01(){
/*
* 当我查询一条数据的时候 从数据库里面拿到值
* 此时实例entil对象状态改变改为托管状态持久化状态
* 当你拿到查询到的值(此时的值是缓存中的值)然后修改它 此时修改后的值存在在内存里面
* 当你提交事务的时候
* jpa会将内存中的值跟缓存中的进行比较若是一致则不修改值 若是不一致则修改缓存里面的值修改数据库里面的值
*/
EntityManager manager = Util.getEntityManager();
manager.getTransaction().begin();
// 此时这个对象已经被持久化并且添加到一级缓存里面了
Student student = manager.find(Student.class, 1L);
//设置值
student.setName("你几号啊");
Student student1 = manager.find(Student.class, 1L);
System.out.println(student.equals(student1));
manager.getTransaction().commit();
System.out.println(student);
manager.close();
}
エンティティ定義ルール:
- Entityクラスは、それらが遅延ロードを使用した場合、後で* lazyloadを教えて継承することはできませんので、最終(最終)型として定義されたメモリ内のコードのサブクラスを作成することはできません
あなたはすべての内部遅延ロードエンティティを使用して、フィールドの使用を見つけることができない場合2。基礎となるコードをパッケージの多くのタイプがヌルでないと判定された
エンティティは、メソッドパラメータの内部構造を有する場合に基本データ型がヌルがどのように比較は、ノンパラメトリック法を提供するように設定する必要がある場合3.
このような使用の検索などを、コンフィギュレーションパラメータをせずに使用されますオブジェクトを作成する方法
エンティティ間の関係:
依存関係:
依存性注入(DI):被験者は、クラスの中に注入され、依存性注入(コントロールのIOC反転)と呼ばれるプロセス
関係(JPA難易):点の内容や性質に応じて:従業員と部門の間には相関がある、このようなクラスとして、および
- 複数の多くのメンバーの部門に対応
- 多く:学生の教師の対応数
- 多:文字(俳優学生教師)複数の権利に対応し、権利が複数の役割を管理します
- 一つ:空間QQのQQに対応する一対一ID番号に対応する
ナビゲーション抵抗の評価:
一方向のみ:A側からB側別の側面を得るが、当事者は、単一の(B面を得ることができません愛のときめき)
双方向:お互いを得ることができます**愛
一方向多対スタッフや部署
:コンビネーション関係
なサイトとして(多対多の部分と全体、全体と部分との間には分離できない)、そして人々が
プロジェクトに反映:それはバックグラウンドではありませんした後、あなたが次の注文の際に、たとえば、文書を必要とします割り切れるの一部
集約関係:
(と一体の部分との間の多対多、および積分部分は別々に存在していてもよい)、
デスクトップコンピュータマウスハードファン
汎化関係:継承反射
達成するために、個々のコードの多くは、関係の組み合わせ:
@Test
public void testname() throws Exception {
/*若是先保存多方在保存一方则 发送sql为3条 反之为5条
当你将一方的方在上面先执行的时候 先设置的值为dir 然后在设置 员工对象里面的name和age 若是你先保存多方的值则
先设置 员工表的 age和nane 然后再去设置部门表的 name 此时员工表的外键 idr是没有值的 当你设 他会在发送两条修改的sql 修改值
Hibernate: update t_employee set age=?, dpt_id=?, name=? where id=?
Hibernate: update t_employee set age=?, dpt_id=?, name=? where id=?
*/
// 单项多对一
Department department = new Department();
department.setName("市场部");// 设置部门
employee employee = new employee();//创建第一个员工对象
employee.setAge(22);//设置值
employee.setName("小胡");
employee.setDpt(department);// 设置外键
employee employee2 = new employee();//第二个员工对象
employee2.setAge(22);
employee2.setName("小xiang");
employee2.setDpt(department);
EntityManager manager = Util.getEntityManager();
manager.getTransaction().begin();
manager.persist(department);
manager.persist(employee);
manager.persist(employee2);
manager.getTransaction().commit();
manager.close();
}
レイジーロードと緊急時の負荷:
懒加载@ManyToOne(fetch = FetchType.LAZY)
就是当你需要的时候采取数据库里面取数据:
延时加载 即需要使用的时候采取加载可能会相对慢点但是对于内存占用率少
急加载 @ManyToOne(fetch = FetchType.EAGER)
同懒加载相反
レイジーレコード基礎となる原則:finad使用しないのはなぜ
怠惰な負荷テストコードを
@Test
public void testLazy()throws Exception{
/*
* 理解 底层原理 懒加载
* 非find--查询出来放入缓存里面employee 把放入缓存里面
* 第二次在获取的时候,从缓存里面找是否有分类的名称,如果没有分类名称
* getName,在发送sql查询分类名称
* 延迟加载 跟你生成额外的 departenmt的子类 cn.itsource.jpa.Departmentt_$$_jvsta7d_1 若是使用find 则无法生成子类则
* 无法使用懒加载默认急加载
* */
EntityManager entityManager = Util.getEntityManager();
employee employee = entityManager.find(employee.class, 8L);
//得到分类名称
if(employee.getDpt() == null){
System.out.println("没有外键");
}else{
System.out.println("有外键");
}
System.out.println(employee.getDpt().getName());//.getName 的时候才发出sql语句
System.out.println(employee.getDpt().getClass());//延迟加载 跟你生成额外的 departenmt的子类 cn.itsource.jpa.Departmentt_$$_jvsta7d_1
}
二次キャッシュ:
二次キャッシュがどのようなものです:
キャッシュは、条件を打ちます:
:キャッシュは条件ヒット
同じオブジェクトの管理と同じ工場で同じオブジェクトをOID
2つのキャッシュヒットの条件:
同じオブジェクト管理OIDと同じ植物の異なるオブジェクトを
二次キャッシュを使用するときは:
- 変更されたデータ、キャッシュ同期チェンジので修正より大きいを読みます
- データの排他制御を持っているために、データは、サードパーティの変更はできません。あなたがデータを変更した場合、キャッシュも変更する必要があります
- データ・キャッシュの内部で(例えば以下の厳しいリアルタイムデータのログ情報など)は、無効なデータを容認することができます
- 大量のデータは、キャッシュ(パッシベーションencacheサポートメモリディスク・ストレージ)に適合しない場合
テスト2つのキャッシュ・コード
@Test
public void test11()throws Exception{
/* 当我们第一次查询到数据的时候会将数据放入一级缓存和二级缓存里面 一级缓存依赖的是管理着对象
二级缓存依赖的是工厂对象 两种方式依赖的对象不一样
* 当我们使用 manger。close的时候是清除一级缓存二级缓存并没有被清除
* 所以当我们使用不同的管理着对象查询的时候先去的一级缓存里面找然后去二级缓存里面找
* 若是匹配则 直接拿来用所以 此代码只发送一条sql语句
* */
// 测试二级缓存 同一个 共工厂对象 不同的管理着对象 同一个oid
EntityManager manager1 = Util.getEntityManager();
manager1.find(employee.class, 8L);
manager1.close();
EntityManager manager2 = Util.getEntityManager();
manager2.find(employee.class,8L );
manager2.close();
}
二次キャッシュメモコード:
@Test
public void test12()throws Exception{
/* 当我们在find查询方法之前床创建对象的时候 此的的这个对象是顺时状态 所以没有加入二级缓存
* 若是在find之后创建的对象就会加如二级缓存
此代码发送两条sql
* */
EntityManager manager1 = Util.getEntityManager();
EntityManager manager2 = Util.getEntityManager();
manager1.find(employee.class,8L );
manager1.close();
manager2.find(employee.class,8L );
manager2.close();
}
}