1.What
is ORM ?
ORM
stands for object/relational mapping. ORM is the automated persistence of
objects in a Java application to the tables in a relational database.
2.What
does ORM consists of ?
An
ORM solution consists of the followig four pieces:
- API for performing basic CRUD operations
- API to express queries refering to classes
- Facilities to specify metadata
- Optimization facilities : dirty checking,lazy
associations fetching
3.What
are the ORM levels ?
The
ORM levels are:
- Pure relational (stored procedure.)
- Light objects mapping (JDBC)
- Medium object mapping
- Full object Mapping (composition,inheritance,
polymorphism, persistence by reachability)
4.What
is Hibernate?
Hibernate
is a pure Java object-relational mapping (ORM) and persistence framework that
allows you to map plain old Java objects to relational database tables using
(XML) configuration files.Its purpose is to relieve the developer from a
significant amount of relational data persistence-related programming tasks.
5.Why
do you need ORM tools like hibernate?
The
main advantage of ORM like hibernate is that it shields developers from messy
SQL. Apart from this, ORM provides following benefits:
- Improved productivity
- High-level object-oriented API
- Less Java code to write
- No SQL to write
- Improved performance
- Sophisticated caching
- Lazy loading
- Eager loading
- Improved maintainability
- A lot less code to write
- Improved portability
- ORM framework generates database-specific SQL
for you
6.What
Does Hibernate Simplify?
Hibernate
simplifies:
- Saving and retrieving your domain objects
- Making database column and table name changes
- Centralizing pre save and post retrieve logic
- Complex joins for retrieving related items
- Schema creation from object model
7.What
is the need for Hibernate xml mapping file?
Hibernate
mapping file tells Hibernate which tables and columns to use to load and store
objects. Typical mapping file look as follows:
8.What are the most common methods of Hibernate configuration?
The
most common methods of Hibernate configuration are:
- Programmatic configuration
- XML configuration (hibernate.cfg.xml)
9.What are the important tags of hibernate.cfg.xml?
Following
are the important tags of hibernate.cfg.xml:
10.What are the Core interfaces are of Hibernate framework?
The
five core interfaces are used in just about every Hibernate application. Using
these interfaces, you can store and retrieve persistent objects and control
transactions.
- Session interface
- SessionFactory interface
- Configuration interface
- Transaction interface
- Query and Criteria interfaces
11.What
role does the Session interface play in Hibernate?
The Session interface is the primary
interface used by Hibernate applications. It is a single-threaded, short-lived
object representing a conversation between the application and the persistent
store. It allows you to create query objects to retrieve persistent objects.
Session session = sessionFactory.openSession();
Session session = sessionFactory.openSession();
Session
interface role:
- Wraps a JDBC connection
- Factory for Transaction
- Holds a mandatory (first-level) cache of
persistent objects, used when navigating the object graph or looking up
objects by identifier
12.What
role does the SessionFactory interface play in Hibernate?
The application obtains Session
instances from a SessionFactory. There is typically a single SessionFactory for
the whole applicationÃ¥¹¼reated during application initialization. The
SessionFactory caches generate SQL statements and other mapping metadata that
Hibernate uses at runtime. It also holds cached data that has been read in one
unit of work and may be reused in a future unit of work
SessionFactory sessionFactory = configuration.buildSessionFactory();
SessionFactory sessionFactory = configuration.buildSessionFactory();
13.What is the general flow of Hibernate communication with RDBMS?
The
general flow of Hibernate communication with RDBMS is :
- Load the Hibernate configuration file and
create configuration object. It will automatically load all hbm mapping
files
- Create session factory from configuration
object
- Get one session from this session factory
- Create HQL Query
- Execute query to get list containing Java
objects
14.What is Hibernate Query Language (HQL)?
Hibernate
offers a query language that embodies a very powerful and flexible mechanism to
query, store, update, and retrieve objects from a database. This language, the
Hibernate query Language (HQL), is an object-oriented extension to SQL.
15.How do you map Java Objects with Database tables?
- First we need to write Java domain objects
(beans with setter and getter).
- Write hbm.xml, where we map java class to
table and database columns to Java class variables.
Example :
name="userName" not-null="true" type="java.lang.String"/>
name="userPassword" not-null="true" type="java.lang.String"/>
16.What’s
the difference between load() and get()?
load()
vs. get() :-
load()
|
get()
|
Only use
the load() method if you are
sure that the object exists.
|
If you are not sure that the object
exists, then use one of the get()methods.
|
load() method will throw
an exception if the unique id is not found in the database.
|
get() method will return null if the unique id is not found in the
database.
|
load() just returns a
proxy by default and database won’t be hit until the proxy is first invoked.
|
get() will hit the database immediately.
|
17.What is the difference between and
merge and update ?
Use update() if
you are sure that the session does not contain an already persistent instance
with the same identifier, and merge() if
you want to merge your modifications at any time without consideration of the
state of the session.
18.How do you define sequence generated primary key in hibernate?
Using
tag.
Example:-
Example:-
name="table">SEQUENCE_NAME
19.Define cascade and inverse option in
one-many mapping?
cascade
- enable operations to cascade to child entities.
cascade="all|none|save-update|delete|all-delete-orphan"
inverse - mark this collection as the "inverse" end of a bidirectional association.
inverse="true|false"
Essentially "inverse" indicates which end of a relationship should be ignored, so when persisting a parent who has a collection of children, should you ask the parent for its list of children, or ask the children who the parents are?
cascade="all|none|save-update|delete|all-delete-orphan"
inverse - mark this collection as the "inverse" end of a bidirectional association.
inverse="true|false"
Essentially "inverse" indicates which end of a relationship should be ignored, so when persisting a parent who has a collection of children, should you ask the parent for its list of children, or ask the children who the parents are?
20.What do you mean by Named – SQL query?
Named
SQL queries are defined in the mapping xml document and called wherever
required.
Example:
Example:
SELECT emp.EMP_ID AS {emp.empid},
emp.EMP_ADDRESS AS {emp.address},
emp.EMP_NAME AS {emp.name}
FROM Employee EMP WHERE emp.NAME LIKE :name
Invoke
Named Query :
List
people = session.getNamedQuery("empdetails")
.setString("TomBrady", name)
.setMaxResults(50)
.list();
.setString("TomBrady", name)
.setMaxResults(50)
.list();
21.How do you invoke Stored Procedures?
{ ? = call selectAllEmployees() }
22.Explain Criteria API
Criteria
is a simplified API for retrieving entities by composing Criterion objects.
This is a very convenient approach for functionality like "search"
screens where there is a variable number of conditions to be placed upon the
result set.
Example :
Example :
List
employees = session.createCriteria(Employee.class)
.add(Restrictions.like("name", "a%") )
.add(Restrictions.like("address", "Boston"))
.addOrder(Order.asc("name") )
.list();
.add(Restrictions.like("name", "a%") )
.add(Restrictions.like("address", "Boston"))
.addOrder(Order.asc("name") )
.list();
23.Define HibernateTemplate?
org.springframework.orm.hibernate.HibernateTemplate is
a helper class which provides different methods for querying/retrieving data
from the database. It also converts checked HibernateExceptions into unchecked
DataAccessExceptions.
24.What are the benefits does HibernateTemplate provide?
The
benefits of HibernateTemplate are :
·
HibernateTemplate, a Spring Template class simplifies interactions
with Hibernate Session.
- Common functions are simplified to single
method calls.
- Sessions are automatically closed.
- Exceptions are automatically caught and
converted to runtime exceptions.
25.How do you switch between relational
databases without code changes?
Using
Hibernate SQL Dialects , we can switch databases. Hibernate will generate
appropriate hql queries based on the dialect defined.
26.If you want to see the Hibernate generated SQL statements on console, what should we do?
In Hibernate configuration file set
as follows:
name="show_sql">true
27.What are derived properties?
The
properties that are not mapped to a column, but calculated at runtime by
evaluation of an expression are called derived properties. The expression can
be defined using the formula attribute of the element.
28.What is component mapping in Hibernate?
- A component is an object saved as a value, not
as a reference
- A component can be saved directly without
needing to declare interfaces or identifier properties
- Required to define an empty constructor
- Shared references not supported
Example:
29.What is the difference between sorted
and ordered collection in hibernate?
sorted
collection vs. order collection :-
sorted collection
|
order collection
|
A sorted collection is
sorting a collection by utilizing the sorting features provided by the Java
collections framework. The sorting occurs in the memory of JVM which running
Hibernate, after the data being read from database using java comparator.
|
Order collection is sorting a collection by
specifying the order-by clause for sorting this collection when
retrieval.
|
If your collection is
not large, it will be more efficient way to sort it.
|
If your collection is very large, it will be more
efficient way to sort it .
|
31.What is the advantage of Hibernate
over jdbc?
Hibernate
Vs. JDBC :-
JDBC
|
Hibernate
|
With
JDBC, developer has to write code to map an object model's data
representation to a relational data model and its corresponding database
schema.
|
Hibernate is flexible and powerful
ORM solution to map Java classes to database tables. Hibernate itself takes
care of this mapping using XML files so developer does not need to write code
for this.
|
With
JDBC, the automatic mapping of Java objects with database tables and vice
versa conversion is to be taken care of by the developer manually with lines
of code.
|
Hibernate provides transparent
persistence and developer does not need to write code explicitly to map
database tables tuples to application objects during interaction with RDBMS.
|
JDBC
supports only native Structured Query Language (SQL). Developer has to find
out the efficient way to access database, i.e. to select effective query from
a number of queries to perform same task.
|
Hibernate provides a powerful query
language Hibernate Query Language (independent from type of database) that is
expressed in a familiar SQL like syntax and includes full support for
polymorphic queries. Hibernate also supports native SQL statements. It also
selects an effective way to perform a database manipulation task for an
application.
|
Application
using JDBC to handle persistent data (database tables) having database
specific code in large amount. The code written to map table data to
application objects and vice versa is actually to map table fields to object
properties. As table changed or database changed then it’s essential to
change object structure as well as to change code written to map
table-to-object/object-to-table.
|
Hibernate provides this mapping
itself. The actual mapping between tables and application objects is done in
XML files. If there is change in Database or in any table then the only need
to change XML file properties.
|
With
JDBC, it is developer’s responsibility to handle JDBC result set and convert
it to Java objects through code to use this persistent data in application.
So with JDBC, mapping between Java objects and database tables is done
manually.
|
Hibernate reduces lines of code by
maintaining object-table mapping itself and returns result to application in
form of Java objects. It relieves programmer from manual handling of
persistent data, hence reducing the development time and maintenance cost.
|
With
JDBC, caching is maintained by hand-coding.
|
Hibernate, with Transparent
Persistence, cache is set to application work space. Relational tuples are
moved to this cache as a result of query. It improves performance if client
application reads same data many times for same write. Automatic Transparent
Persistence allows the developer to concentrate more on business logic rather
than this application code.
|
In JDBC
there is no check that always every user has updated data. This check has to
be added by the developer.
|
Hibernate enables developer to
define version type field to application, due to this defined field Hibernate
updates version field of database table every time relational tuple is
updated in form of Java class object to that table. So if two users retrieve
same tuple and then modify it and one user save this modified tuple to
database, version is automatically updated for this tuple by Hibernate. When
other user tries to save updated tuple to database then it does not allow
saving it because this user does not have updated data.
|
32.What are the Collection types in
Hibernate ?
- Bag
- Set
- List
- Array
- Map
33.What are the ways to express joins in HQL?
HQL
provides four ways of expressing (inner and outer) joins:-
- An implicit association
join
- An ordinary join in the FROM clause
- A fetch join in the FROM clause.
- A theta-style join in
the WHERE clause.
34.Define cascade and inverse option in one-many mapping?
cascade
- enable operations to cascade to child entities.
cascade="all|none|save-update|delete|all-delete-orphan"
inverse - mark this collection as the "inverse" end of a bidirectional association.
inverse="true|false"
Essentially "inverse" indicates which end of a relationship should be ignored, so when persisting a parent who has a collection of children, should you ask the parent for its list of children, or ask the children who the parents are?
cascade="all|none|save-update|delete|all-delete-orphan"
inverse - mark this collection as the "inverse" end of a bidirectional association.
inverse="true|false"
Essentially "inverse" indicates which end of a relationship should be ignored, so when persisting a parent who has a collection of children, should you ask the parent for its list of children, or ask the children who the parents are?
35.What is Hibernate proxy?
The proxy attribute
enables lazy initialization of persistent instances of the class. Hibernate
will initially return CGLIB proxies which implement the named interface. The
actual persistent object will be loaded when a method of the proxy is invoked.
36.How can Hibernate be configured to
access an instance variable directly and not through a setter method ?
By
mapping the property with access="field" in Hibernate metadata. This
forces hibernate to bypass the setter method and access the instance variable directly
while initializing a newly loaded object.
37.How can a whole class be mapped as immutable?
Mark the class as mutable="false" (Default is true),. This specifies that instances of the class are (not) mutable. Immutable classes, may not be updated or deleted by the application.
38.What is the use of dynamic-insert and dynamic-update attributes in a class mapping?
Criteria
is a simplified API for retrieving entities by composing Criterion objects.
This is a very convenient approach for functionality like "search"
screens where there is a variable number of conditions to be placed upon the
result set.
- dynamic-update (defaults
to false): Specifies that UPDATE SQL
should be generated at runtime and contain only those columns whose values
have changed
- dynamic-insert (defaults
to false): Specifies that INSERT SQL
should be generated at runtime and contain only the columns whose values
are not null.
39.What do you mean by fetching strategy ?
A fetching
strategy is the strategy Hibernate will use for retrieving
associated objects if the application needs to navigate the association. Fetch
strategies may be declared in the O/R mapping metadata, or over-ridden by a
particular HQL or Criteria query.
40.What is automatic dirty checking?
Automatic
dirty checking is a feature that saves us the effort of explicitly asking
Hibernate to update the database when we modify the state of an object inside a
transaction.
41.What is transactional write-behind?
Hibernate
uses a sophisticated algorithm to determine an efficient ordering that avoids
database foreign key constraint violations but is still sufficiently
predictable to the user. This feature is called transactional write-behind.
42.What are Callback interfaces?
Callback
interfaces allow the application to receive a notification when something
interesting happens to an object—for example, when an object is loaded, saved,
or deleted. Hibernate applications don't need to implement these callbacks, but
they're useful for implementing certain kinds of generic functionality.
43.What are the types of Hibernate instance states ?
Three
types of instance states:
- Transient -The instance is not associated with
any persistence context
- Persistent -The instance is associated with a
persistence context
- Detached -The instance was associated with a
persistence context which has been closed – currently not associated
45.What are the types of inheritance
models in Hibernate?
There
are three types of inheritance models in Hibernate:
- Table per class hierarchy
- Table per subclass
- Table per concrete class
46.
Difference between session.save() , session.saveOrUpdate() and
session.persist()?
session.save()
:
Save does an insert and will fail if the primary key is already persistent.
session.saveOrUpdate()
:
saveOrUpdate does a select first to determine if it needs to do an insert or an
update. Insert data if primary key not exist otherwise update data.
session.persist()
:
Does the same like session.save(). But session.save() return Serializable
object but session.persist() return void.
session.save() returns the generated identifier (Serializable object)
and session.persist() doesn't.
For Example :
if
you do :-
System.out.println(session.save(question));
This will print the generated primary key.
if
you do :-
System.out.println(session.persist(question));
Compile time error because session.persist() return void.
47.
What is lazy fetching in Hibernate? With Example .
Lazy fetching decides whether to load child
objects while loading the Parent Object.
You need to do this setting respective hibernate
mapping file of the parent class.
Lazy
= true (means not to load child)
By default the lazy loading of the child objects
is true.
This make sure that
the child objects are not loaded unless they are explicitly invoked in the
application by calling getChild() method on parent.In this case hibernate
issues a fresh database call to load the child when getChild() is actully
called on the Parent object.But in some cases you do need to load the child
objects when parent is loaded.
Just make the Lazy=false and hibernate will load the
child when parent is loaded from the database.
Example
:
If you have a TABLE EMPLOYEE mapped to Employee object and
contains set of Address objects.
Parent Class : Employee class
Child class : Address
Class
public class Employee
{
private Set address = new HashSet(); // contains
set of child Address objects
public Set getAddress () {
return address;
}
public void setAddresss(Set address) {
this. address =
address;
}
}
In
the Employee.hbm.xml file
<set name="address" inverse="true" cascade="delete"
lazy="false">
<key column="a_id" />
<one-to-many class="beans
Address"/>
</set>
In the above configuration.
If lazy="false"
: - when you load the Employee object that time child object Adress is also
loaded and set to setAddresss() method.
If you call employee.getAdress() then loaded data
returns. No fresh database call.
If lazy="true"
:- This the default configuration. If you dont mention then hibernate consider
lazy=true.
when you load the Employee object that time child
object Adress is not loaded. You need extra call to data base to get address
objects.
If you call employee.getAdress() then that time
database query fires and return results. Fresh database call.
48.
Difference between session.saveOrUpdate() and session.merge();
saveOrUpdate()
does the following:
Ø if
the object is already persistent in this session, do nothing
Ø if
another object associated with the session has the same identifier, throw an
exception
Ø if
the object has no identifier property, save() it
Ø if
the object's identifier has the value assigned to a newly instantiated object,
save() it
Ø if
the object is versioned (by a <version> or <timestamp>),
and the version property value is the same value assigned to a newly
instantiated object, save() it
Ø otherwise
update() the object
merge()
is very different:
Ø if
there is a persistent instance with the same identifier currently associated
with the session, copy the state of the given object onto the persistent
instance
Ø if
there is no persistent instance currently associated with the session, try to
load it from the database, or create a new persistent instance
Ø the
persistent instance is returned
Ø the
given instance does not become associated with the session, it remains detached
49.How
to prevent concurrent update in Hibernate?
Version
checking used in hibernate when more than one thread trying to access same
data.
For example :
User A edit the row of the TABLE for update (In
the User Interface changing data - This is user thinking time) and in the same
time User B edit the same record for update and click the update.
Then User A click the Update and update done. Change
made by user B is gone.
In hibernate you can prevent slate object updation
using version checking.
Check the version of the row when you are updating
the row.
Get the version of the row when you are fetching
the row of the TABLE for update.
On the time of updation just fetch the version
number and match with your version number (on the time of fetching).
This way you can prevent slate object updation.
Steps
1:
Declare a variable "versionId" in your
Class with setter and getter.
public class Campign
{
private Long
versionId;
private Long
campignId;
private String name;
public Long
getVersionId() {
return
versionId;
}
public void
setVersionId(Long versionId) {
this.versionId
= versionId;
}
public String
getName() {
return
name;
}
public void
setName(String name) {
this.name
= name;
}
public Long
getCampignId() {
return campignId;
}
private void
setCampignId(Long campignId) {
this.campignId = campignId;
}
}
Step
2:-
In the .hbm.xml file
<class name="beans.Campign"
table="CAMPIGN" optimistic-lock="version">
<id
name="campignId" type="long" column="cid">
<generator
class="sequence">
<param
name="sequence">CAMPIGN_ID_SEQ</param>
</generator>
</id>
<version name="versionId"
type="long" column="version" />
<property
name="name" column="c_name"/>
</class>
Step
3:-
Create a coulmn name "version" in the
CAMPIGN table.
Step
4:-
In the code
// foo is an instance loaded by a previous Session
session = sf.openSession();
int oldVersion = foo.getVersion();
session.load( foo, foo.getKey() );
if ( oldVersion!=foo.getVersion ) throw new
StaleObjectStateException();
foo.setProperty("bar");
session.flush();
session.connection().commit();
session.close();
You can handle StaleObjectStateException() and do
what ever you want.
You can display error message. Hibernate
autumatically create/update the version number when you update/insert any row
in the table.
50.
How to set 2nd level cache in hibernate with EHCache?
When you are creating SessionFactory just add the
below steps
String ecache = appHome+File.separatorChar+"ehcache.xml";
try {
CacheManager.create(ecache);
} catch (CacheException e) {
// logger.logError(e);
}*/
Then
sessionFactory =
configuration.buildSessionFactory();
ECache.xml
is like
<ehcache>
<diskStore path="java.io.tmpdir"/>
<defaultCache maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120" timeToLiveSeconds="120"
overflowToDisk="true"
diskPersistent="false" diskExpiryThreadIntervalSeconds="120"
/>
<cache
name="bean.ApplicationBean" maxElementsInMemory="300"
eternal="false" overflowToDisk="false"
/>
</ehcache>
ApplicationBean will be avilable in 2nd level
cache
51.
Difference between list() and iterate() i9n Hibernate?
If instances are already be in the session or
second-level cache iterate() will give better performance.
If they are not already cached, iterate() will be
slower than list() and might require many database hits for a simple query.
52.
Difference between
getCurrentSession() and openSession() in Hibernate ?
getCurrentSession()
:
The "current session" refers to a
Hibernate Session bound by Hibernate behind the scenes, to the transaction
scope.
A Session is opened when getCurrentSession() is
called for the first time and closed when the transaction ends.
It is also flushed automatically before the transaction
commits. You can call getCurrentSession() as often and anywhere you want as
long as the transaction runs.
To enable this strategy in your Hibernate
configuration:
set hibernate.transaction.manager_lookup_class to
a lookup strategy for your JEE container
set hibernate.transaction.factory_class to
org.hibernate.transaction.JTATransactionFactory
Only the Session that you obtained with
sf.getCurrentSession() is flushed and closed automatically.
Example :
try {
UserTransaction tx = (UserTransaction)new
InitialContext() .lookup("java:comp/UserTransaction");
tx.begin();
// Do some work
sf.getCurrentSession().createQuery(...);
sf.getCurrentSession().persist(...);
tx.commit();
}
catch (RuntimeException e) {
tx.rollback();
throw e; // or display error message
}
openSession()
:
If you decide to use manage the Session yourself
the go for sf.openSession() , you have to flush() and close() it.
It does not flush and close() automatically.
Example :
UserTransaction tx = (UserTransaction)new
InitialContext() .lookup("java:comp/UserTransaction");
Session session = factory.openSession();
try {
tx.begin();
// Do some work
session.createQuery(...);
session.persist(...);
session.flush(); // Extra work you need to do
tx.commit();
}
catch (RuntimeException e) {
tx.rollback();
throw e; // or display error message
}
finally {
session.close(); // Extra work you need to do
}
53.
One To Many Bi-directional Relation in Hibernate?
Bi-DireCtional
One to Many Relation- EXAMPLE
PROCESS_TYPE_LOV (PROCESS_TYPE_ID number,
PROCESS_TYPE_NAME varchar) - TABLE
PROCESS (PROCESS_ID number,PROCESS_NAME
varchar,PROCESS_TYPE_ID number)- TABLE
public class ProcessTypeBean
{
private Long processTypeId;
private
String processTypeName;
private
List processes = null;
/**
*
@return Returns the processes.
*/
public
List getProcesses() {
return processes;
}
/**
*
@param processes The processes to set.
*/
public
void setProcesses(List processes) {
this.processes = processes;
}
/**
*
@return Returns the processTypeId.
*/
public
Long getProcessTypeId() {
return processTypeId;
}
/**
*
@param processTypeId The processTypeId to set.
*/
public
void setProcessTypeId(Long processTypeId) {
this.processTypeId = processTypeId;
}
/**
*
@return Returns the processTypeName.
*/
public
String getProcessTypeName() {
return processTypeName;
}
/**
*
@param processTypeName The processTypeName to set.
*/
public
void setProcessTypeName(String processTypeName) {
this.processTypeName = processTypeName;
}
}
public class ProcessBean
{
private Long processId;
private
String processName = "";
private
ProcessTypeBean processType;
public
Long getProcessId() {
return processId;
}
/**
*
@param processId The processId to set.
*/
public
void setProcessId(Long processId) {
this.processId = processId;
}
/**
*
@return Returns the processName.
*/
public
String getProcessName() {
return processName;
}
/**
*
@param processName The processName to set.
*/
public
void setProcessName(String processName) {
this.processName = processName;
}
/**
*
@return Returns the processType.
*/
public
ProcessTypeBean getProcessType() {
return processType;
}
/**
*
@param processType The processType to set.
*/
public
void setProcessType(ProcessTypeBean processType) {
this.processType = processType;
}
}
<class
name="com.bean.ProcessBean" table="PROCESS">
<id
name="processId" type="long" column="PROCESS_ID"
/>
<property
name="processName" column="PROCESS_NAME"
type="string" length="50" />
<many-to-one
name="processType" column="PROCESS_TYPE_ID"
lazy="false" />
</class>
<class
name="com.bean.ProcessTypeBean" table="PROCESS_TYPE_LOV">
<id
name="processTypeId" type="long"
column="PROCESS_TYPE_ID" />
<property
name="processTypeName" column="PROCESS_TYPE_NAME" type="string" length="50"
/>
<bag
name="processes" inverse="true" cascade="delete"
lazy="false">
<key
column="PROCESS_TYPE_ID" />
<one-to-many
class="com.bean.ProcessBean" />
</bag>
</class>
54.
One To Many Mapping Using List ?
WRITER
(ID INT,NAME VARCHAR) - TABLE
STORY
(ID INT,INFO VARCHAR,PARENT_ID INT) - TABLE
One writer can have multiple stories..
-------------------------------------------------------------
Mapping File...
<?xml version="1.0"
encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping
DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<class name="Writer"
table="WRITER">
<id
name="id" unsaved-value="0">
<generator
class="increment"/>
</id>
<list
name="stories" cascade="all">
<key
column="parent_id"/>
<one-to-many
class="Story"/>
</list>
<property
name="name" type="string"/>
</class>
<class name="Story" table="story">
<id
name="id" unsaved-value="0">
<generator
class="increment"/>
</id>
<property
name="info"/>
</class>
</hibernate-mapping>
-------------------------------------------------------
public class Writer
{
private int id;
private String name;
private List stories;
public void setId(int
i) {
id
= i;
}
public int getId() {
return
id;
}
public void
setName(String n) {
name
= n;
}
public String
getName() {
return
name;
}
public void
setStories(List l) {
stories
= l;
}
public List
getStories() {
return
stories;
}
}
---------------------------------------------------
public class Story
{
private int id;
private String info;
public Story(){
}
public Story(String
info) {
this.info
= info;
}
public void setId(int
i) {
id
= i;
}
public int getId() {
return
id;
}
public void
setInfo(String n) {
info
= n;
}
public String
getInfo() {
return
info;
}
}
----------------------------------------------------
Save Example ..
Writer wr = new Writer();
wr.setName("Das");
ArrayList list = new ArrayList();
list.add(new Story("Story Name 1"));
list.add(new Story("Story Name 2"));
wr.setStories(list);
Transaction transaction = null;
try {
transaction = session.beginTransaction();
session.save(sp);
transaction.commit();
} catch (Exception e) {
if (transaction != null) {
transaction.rollback();
throw e;
}
} finally {
session.close();
}
55.Many
To Many Relation In Hibernate ?
Best Example. For Many to Many in Hibernate ..
EVENTS
( uid int, name VARCHAR) Table
SPEAKERS
( uid int, firstName VARCHAR) Table
EVENT_SPEAKERS
(elt int, event_id int, speaker_id int) Table
-----------------------------------------------------------
import java.util.Set;
import java.util.HashSet;
public class Speaker{
private Long id;
private String
firstName;
private Set events;
public Long getId() {
return
id;
}
public void
setId(Long id) {
this.id
= id;
}
public String
getFirstName() {
return
firstName;
}
public void
setFirstName(String firstName) {
this.firstName
= firstName;
}
public Set
getEvents() {
return
this.events;
}
public void
setEvents(Set events) {
this.events
= events;
}
private void
addEvent(Event event) {
if
(events == null) {
events
= new HashSet();
}
events.add(event);
}
}
--------------------------------------------------------
import java.util.Date;
import java.util.Set;
public class Event{
private Long id;
private String name;
private Set speakers;
public void
setId(Long id) {
this.id = id;
}
public Long getId() {
return id;
}
public String
getName() {
return name;
}
public void
setName(String name) {
this.name = name;
}
public void
setSpeakers(Set speakers) {
this.speakers =
speakers;
}
public Set
getSpeakers() {
return speakers;
}
}
--------------------------------------------------------------
Event.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD
2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<class name="Event"
table="events">
<id name="id"
column="uid" type="long" unsaved-value="null">
<generator class="increment"/>
</id>
<property name="name"
type="string" length="100"/>
<set name="speakers"
table="event_speakers" cascade="all">
<key column="event_id"/>
<many-to-many class="Speaker"/>
</set>
</class>
</hibernate-mapping>
------------------------------------------------------------------
Speaker.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD
2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<class name="Speaker"
table="speakers">
<id name="id"
column="uid" type="long">
<generator class="increment"/>
</id>
<property name="firstName" type="string"
length="20"/>
<set name="events"
table="event_speakers" cascade="all">
<key column="speaker_id"/>
<many-to-many class="Event"/>
</set>
</class>
</hibernate-mapping>
----------------------------------------------------------------------
Save and Fetch Example
Event event = new Event();
event.setName("Inverse test");
event.setSpeakers(new HashSet());
event.getSpeakers().add(new
Speaker("Ram", event));
event.getSpeakers().add(new
SpeakerManyToMany("Syam", event));
event.getSpeakers().add(new
SpeakerManyToMany("Jadu", event));
session.save(event); /// Save All the Data
event = (Event) session.load(Event.class,
event.getId());
Set speakers = event.getSpeakers();
for (Iterator i = speakers.iterator();
i.hasNext();) {
Speaker speaker = (Speaker) i.next();
System.out.println(speaker.getFirstName());
System.out.println(speaker.getId());
}
No comments:
Post a Comment