ORM is an acronym for Object/Relational mapping. It is a programming strategy to map object with the data stored in the database. It simplifies data creation, data manipulation, and data access.
The advantages of using ORM over JDBC
- Application development is fast.
- Management of transaction.
- Generates key automatically.
- Details of SQL queries are hidden.
Hibernate Architecture
- Java application layer
- Hibernate framework layer
- Backhand api layer
- Database layer
Hibernate Application Architecture:
JDBC (Java Database Connectivity)
JTA (Java Transaction API)
JNDI (Java Naming Directory Interface)
Elements of Hibernate Architecture
Configuration
- Database Connection − This is handled through one or more configuration files supported by Hibernate. These files are hibernate.properties and hibernate.cfg.xml.
- Class Mapping Setup − This component creates the connection between the Java classes and database tables.
SessionFactory
SessionFactory is a thread-safe object, many threads cannot access it simultaneously.
Session
- It maintains a connection between the hibernate application and database.It provides methods to store, update, delete or fetch data from the database such as persist(), update(), delete(), load(), get() etc.
- Session is not a thread-safe object, many threads can access it simultaneously. In other words, you can share it between threads.
Transaction
ConnectionProvider
Query
Query objects use SQL or Hibernate Query Language (HQL) string to retrieve data from the database and create objects. A Query instance is used to bind query parameters, limit the number of results returned by the query, and finally to execute the query.
Criteria
Criteria objects are used to create and execute object oriented criteria queries to retrieve objects.
About SQL
SQL query created in Hibernate(Native sql)
Session.createSQLQuery
1
2
3Session.createSQLQuery()
//The method createSQLQuery() creates Query object using the native SQL syntax.
Query query = session.createSQLQuery("Select * from Student");HQL query
Session.createQuery
1
2
3Session.createQuery()
//The method createQuery() creates Query object using the HQL syntax.
Query query = session.createQuery("from Student s where s.name like 'k%'");criteria query
Session.createCriteria
1
2
3Session.createCriteria()
//The method createCriteria() creates Criteria object for setting the query parameters. This is more useful feature for those who don't want to write the query in hand. You can specify any type of complicated syntax using the Criteria API.
Criteria criteria = session.createCriteria(Student.class);
HQL vs Criteria
- HQL is to perform both select and non-select operations on the data, but Criteria is only for selecting the data, we cannot perform non-select operations using criteria
- HQL is suitable for executing Static Queries, where as Criteria is suitable for executing Dynamic Queries
- HQL doesn’t support pagination concept, but we can achieve pagination with Criteria
- Criteria used to take more time to execute then HQL
- With Criteria we are safe with SQL Injection because of its dynamic query generation but in HQL as your queries are either fixed or parametrized, there is no safe from SQL Injection.
Caching
Cache memory stores recently used data items in order to reduce the number of database hits as much as possible.
First level Cache
Hibernate first level cache is associated with the Session object. Hibernate first level cache is enabled by default and there is no way to disable it. However hibernate provides methods through which we can delete selected objects from the cache or clear the cache completely.Any object cached in a session will not be visible to other sessions and when the session is closed, all the cached objects will also be lost.
Second level Cache
Hibernate Second Level cache is disabled by default but we can enable it through configuration. Currently EHCache and Infinispan provides implementation for Hibernate Second level cache and we can use them.
Query Cache
Hibernate can also cache result set of a query. Hibernate Query Cache doesn’t cache the state of the actual entities in the cache; it caches only identifier values and results of value type. So it should always be used in conjunction with the second-level cache.
types of association mapping
One to One
One to Many
(一对多)单向:会产生中间表,此时可以用@onetoMany @Joincolumn(name=” “)避免产生中间表**,并且指定了外键的名字(别看 @joincolumn在一中写着,但它存在在多的那个表中)
Many to One
(多对一)单向:不产生中间表,但可以用@Joincolumn(name=” “)来指定生成外键的名字,外键在多的一方表中产生!
Many to Many
可参考JPA实体关系映射
为什么要有实体关系映射
简化编程操作。把冗余的操作交给底层框架来处理。
例如,如果我要给一位新入学的学生添加一位新的老师。而这个老师又是新来的,在学生数据库与教师数据库中均不存在对应的数据。那么我需要先在教师数据库中保存新来的老师的数据,同时在学生数据库中保存新学生的数据,然后再给两者建立关联。
而如果我们使用了实体关系映射,我们只需要将该新教师实体交给该学生实体,然后保存该学生实体即可完成。