Hibernate Tutorial
Hibernate Tutorial
Hibernate is an open source object/relational mapping tool for Java. Hibernate lets you
develop persistent classes following common Java idiom - including association,
inheritance, polymorphism, composition and the Java collections framework.
Hibernate not only takes care of the mapping from Java classes to database tables (and
from Java data types to SQL data types), but also provides data query and retrieval
facilities and can significantly reduce development time otherwise spent with manual
data handling in SQL and JDBC.
Hibernates goal is to relieve the developer from 95 percent of common data
persistence related programming tasks.
Hibernate is Free Software. The LGPL license is sufficiently flexible to allow the use of
Hibernate in both open source and commercial projects (see the LicenseFAQ for
details). Hibernate is available for download at http://www.hibernate.org/. This tutorial
aims to provide insight into Hibernate version 3.0RC and its usage
Some of the main features of hibernate are listed below and we have tried to explain
some of them in detail later in this tutorial.
Polymorphic associations
Bidirectional associations
Association filtering
Collections of basic types
Indexed collections
Composite Collection Elements
Lifecycle objects
Automatic primary key generation
Multiple synthetic key generation strategies
Support for application assigned identifiers
Support for composite keys
Object/Relational mapping definition
XML mapping documents
Human-readable format
XDoclet support
HDLCA (Hibernate Dual-Layer Cache Architecture)
Thread safeness
Non-blocking data access
Session level cache
Optional second-level cache
Optional query cache
Works well with others
High performance
Lazy initialization
Outer join fetching
Batch fetching
Support for optimistic locking with versioning/timestamping
Highly scalable architecture
High performance
No "special" database tables
SQL generated at system initialization time
(Optional) Internal connection pooling and PreparedStatement caching
J2EE integration
JMX support
Integration with J2EE architecture (optional)
New JCA support
Hibernate makes use of persistent objects commonly called as POJO (POJO = "Plain
Old Java Object".) along with XML mapping documents for persisting objects to the
database layer. The term POJO refers to a normal Java objects that does not serve
any other special role or implement any special interfaces of any of the Java
frameworks (EJB, JDBC, DAO, JDO, etc...).
Rather than utilize byte code processing or code generation, Hibernate uses runtime
reflection to determine the persistent properties of a class. The objects to be
persisted are defined in a mapping document, which serves to describe the persistent
fields and associations, as well as any subclasses or proxies of the persistent object.
The mapping documents are compiled at application startup time and provide the
framework with necessary information for a class. Additionally, they are used in
support operations, such as generating the database schema or creating stub Java
source files.
<generator class="sequence"/>
</id>
<property column="USER_NAME" length="255" name="userName" not-null="true"
type="java.lang.String"/>
<property column="USER_PASSWORD" length="255" name="userPassword" notnull="true" type="java.lang.String"/>
<property column="USER_FIRST_NAME" length="255" name="userFirstName"
type="java.lang.String"/>
<property column="USER_LAST_NAME" length="255" name="userLastName"
type="java.lang.String"/>
<property column="USER_EMAIL" length="255" name="userEmail"
type="java.lang.String"/>
<property column="USER_CREATION_DATE" length="10" name="userCreationDate"
type="java.util.Date"/>
<property column="USER_MODIFICATION_DATE" length="10"
name="userModificationDate" type="java.util.Date"/>
</class>
</hibernate-mapping>
One can also generate Hibernate mapping documents using Hibernate extension toolset.
Hibernate mapping documents are straight forward. The <class> element maps a table
with corresponding class. The <id> element represents the primary key column, and its
associated attribute in the domain object. The <property> elements represent all other
attributes available in the domain object.
<session-factory>
<property name="show_sql">true</property>
<property
name="hibernate.dialect">org.hibernate.dialect.MySQLMyISAMDialect</property>
<property name="hibernate.connection.driver_class">org.gjt.mm.mysql.Driver</property>
<property
name="hibernate.connection.url">jdbc:mysql://localhost:3306/applabs</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">r00Tp@$wd</property>
<mapping resource="org/applabs/hibernate/quickstart/Applabsuser.hbm.xml"/>
</session-factory>
</hibernate-configuration>
This section will explain how to write the mapping documents manually. Although there
are tools available to create these mapping documents, learning how to create these
documents manually helps in fine tuning and setting up advance table mapping.
Mapping Declaration
Object/relational mappings are usually defined in XML document. The mapping language
is Java-centric, meaning that mappings are constructed around persistent class
declarations, not table declarations.
Mapping Document
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.somepackage.eg">
<class name="Foo" table=FooTable>
<id name="id" type=java.lang.Long>
<generator class=sequence/>
</id>
</class>
</hibernate-mapping>
The above example shows a typical mapping document that contains class mapping with
table.
All mapping XML document should refer to hibernate-mapping-3.0.dtd via doctype.
<hibernate-mapping> element
<class> element
The <Class> element maps the domain object with corresponding entity in the database.
hibernate-mapping element allows you to nest several persistent <class> mappings, as
shown above. It is however good practice to map only a single persistent class in one
mapping file and name it after the persistent superclass, e.g. User.hbm.xml,
Group.hbm.xml.
<class
/>
name="ClassName"
table="tableName"
discriminator-value="discriminator_value"
mutable="true|false"
schema="owner"
catalog="catalog"
proxy="ProxyInterface"
dynamic-update="true|false"
dynamic-insert="true|false"
select-before-update="true|false"
polymorphism="implicit|explicit"
where="arbitrary sql where condition"
persister="PersisterClass"
batch-size="N"
optimistic-lock="none|version|dirty|all"
lazy="true|false"
entity-name="EntityName"
catalog="catalog"
check="arbitrary sql check condition"
rowid="rowid"
subselect="SQL expression"
abstract="true|false"
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
(9)
(10)
(11)
(12)
(13)
(14)
(15)
(16)
(17)
(18)
(19)
(20)
(21)
(22)
(1) name (optional): The fully qualified Java class name of the persistent class (or
interface). If this attribute is missing, it is assumed that the mapping is for a nonPOJO entity.
(2) table (optional - defaults to the unqualified class name): The name of its database
table.
(3) discriminator-value (optional - defaults to the class name): A value that distiguishes
individual subclasses, used for polymorphic behaviour. Acceptable values include null and
not null.
(4) mutable (optional, defaults to true): Specifies that instances of the class are (not)
mutable.
(5) schema (optional): Override the schema name specified by the root <hibernatemapping> element.
(6) catalog (optional): Override the catalog name specified by the root <hibernatemapping> element.
(7) proxy (optional): Specifies an interface to use for lazy initializing proxies. You may
specify the name of the class itself.
(8) dynamic-update (optional, defaults to false): Specifies that UPDATE SQL should be
generated at runtime and contain only those columns whose values have changed.
(9) dynamic-insert (optional, defaults to false): Specifies that INSERT SQL should be
generated at runtime and contain only the columns whose values are not null.
(10) select-before-update (optional, defaults to false): Specifies that Hibernate should
never perform an SQL UPDATE unless it is certain that an object is actually modified.
In certain cases (actually, only when a transient object has been associated with a new
session using update()), this means that Hibernate will perform an extra SQL SELECT
to determine if an UPDATE is actually required.
(11) polymorphism (optional, defaults to implicit): Determines whether implicit or
explicit query polymorphism is used.
(12) where (optional) specify an arbitrary SQL WHERE condition to be used when
retrieving objects of this class
(13) persister (optional): Specifies a custom ClassPersister.
(14) batch-size (optional, defaults to 1) specify a "batch size" for fetching instances of
this class by identifier.
(15) optimistic-lock (optional, defaults to version): Determines the optimistic locking
strategy.
(16) lazy (optional): Lazy fetching may be completely disabled by setting lazy="false".
(17) entity-name (optional): Hibernate3 allows a class to be mapped multiple times (to
different tables, potentially), and allows entity mappings that are represented by Maps
or XML at the java level. In these cases, you should provide an explicit arbitrary name
for the entity. See Section 4.4, Dynamic models for more information.
(18) catalog (optional): The name of a database catalog used for this class and its table.
(19) check (optional): A SQL expression used to generate a multi-row check constraint
for automatic schema generation.
(20) rowid (optional): Hibernate can use so called ROWIDs on databases which support.
E.g. on Oracle, Hibernate can use the rowid extra column for fast updates if you set
this option to rowid. A ROWID is an implementation detail and represents the physical
location of a stored tuple.
(21) subselect (optional): Maps an immutable and read-only entity to a database
subselect. Useful if you want to have a view instead of a base table, but don't. See
below for more information.
(22) abstract (optional): Used to mark abstract superclasses in <union-subclass>
hierarchies.
<id> element
The <id> element defines the mapping from that property to the primary key
column. Mapped classes must declare the primary key column of the database
table. Most classes will also have a JavaBeans-style property holding the unique
identifier of an instance.
<id
name="propertyName"
(1)
type="typename"
(2)
column="column_name"
(3)
unsaved-value="null|any|none|undefined| (4)
id_value"
(5)
access="field|property|ClassName">
<generator class="generatorClass"/>
/>
(1) name (optional): The name of the identifier property.
(2) type (optional): A name that indicates the Hibernate type.
(3) column (optional - defaults to the property name): The name of the primary
key column.
(4) unsaved-value (optional - defaults to a "sensible" value): An identifier property
value that indicates that an instance is newly instantiated (unsaved),
distinguishing it from detached instances that were saved or loaded in a
previous session.
(5) access (optional - defaults to property): The strategy Hibernate should use for
accessing the property value.
<generator> element
The optional <generator> child element names a Java class used to generate unique
identifiers for instances of the persistent class. If any parameters are required to
configure or initialize the generator instance, they are passed using the <param>
element.
<property> element
The <property> element declares a persistent, JavaBean style property of the class.
<property
name="propertyName"
column="column_name"
type="typename"
update="true|false"
insert="true|false"
formula="arbitrary SQL expression"
access="field|property|ClassName"
lazy="true|false"
unique="true|false"
not-null="true|false"
optimistic-lock="true|false"
/>
(1)
(2)
(3)
(4)
(4)
(5)
(6)
(7)
(8)
(9)
(10)
instrumentation).
(8) unique (optional): Enable the DDL generation of a unique constraint for the columns.
Also, allow this to be the target of a property-ref.
(9) not-null (optional): Enable the DDL generation of a nullability constraint for the
columns.
(10) optimistic-lock (optional - defaults to true): Specifies that updates to this
property do or do not require acquisition of the optimistic lock. In other words,
determines if a version increment should occur when this property is dirty.
typename could be:
The name of a Hibernate basic type (eg. integer, string, character, date, timestamp,
float, binary, serializable, object, blob).
The name of a Java class with a default basic type (eg. int, float, char, java.lang.String,
java.util.Date, java.lang.Integer, java.sql.Clob).
The name of a serializable Java class.
The class name of a custom type (eg. com.illflow.type.MyCustomType).
<property name="totalPrice"
formula="( SELECT SUM (li.quantity*p.price) FROM LineItem li, Product p
WHERE li.productId = p.productId
AND li.customerId = customerId
AND li.orderNumber = orderNumber )"/>
<many-to-one> element
<many-to-one
name="propertyName"
column="column_name"
class="ClassName"
cascade="cascade_style"
fetch="join|select"
(1)
(2)
(3)
(4)
(5)
update="true|false"
(6)
insert="true|false"
(6)
property-ref="propertyNameFromAssociatedClass" (7)
access="field|property|ClassName"
(8)
unique="true|false"
(9)
not-null="true|false"
(10)
optimistic-lock="true|false"
(11)
lazy="true|false"
(12)
entity-name="EntityName"
/>
<one-to-one> element
Hibernate allows the mapping of Mapped tables with the domain objects using the
persistent collection-valued fields. These fields needs be declared as an interface type.
The actual interface can be java.util.Set, java.util.Collection, java.util.List, java.util.Map,
java.util.SortedSet, java.util.SortedMap or custom implementations of
org.hibernate.usertype.UserCollectionType
Collections instances have the usual behavior of value types. They are automatically
persisted when referenced by a persistent object and automatically deleted when
unreferenced. If a collection is passed from one persistent object to another, its
elements might be moved from one table to another. Two entities may not share a
reference to the same collection instance. Due to the underlying relational model,
collection-valued properties do not support null value semantics;
Hibernate is equipped with an extremely powerful query language that looks very much
like SQL. Queries are case-insensitive, except for names of Java classes and
properties.
Clause
The from clause
The simplest possible Hibernate query is of the form:
From org.applabs.base.User
From User
which simply returns all instances of the class org.applabs.base.User.
Most of the time, you will need to assign an alias, since you will want to refer to the
User in other parts of the query.
from User as user
This query assigns the alias user to User instances, so we could use that alias later in
the query. The as keyword is optional; we could also write:
from User user
Multiple classes may appear, resulting in a cartesian product or "cross" join.
from User, Group
from User as user, Group as group
For databases that support subselects, Hibernate supports subqueries within queries. A
subquery must be surrounded by parentheses (often by an SQL aggregate function
call). Even correlated subqueries (subqueries that refer to an alias in the outer query)
are allowed.
In this section we will extend our quick start sample into to a web based application
that comprises of struts and Hibernate support.
Introduction
In this example we will build a simple web based document repository application using
hibernate. The document repository under consideration will have categorization of the
documents based on the topics (Folder based like structure), Keywords for each
document (this will simplify searches), versioning for each document, Document
modification history, permissions based access for each entity based on users and
groups.
Database scheme.
The concept of properties tables: Here we have extended the concept of Hash tables
to the database, Instead of adding more and more columns as per growing needs A
properties table is created per Entity, Each property (Prop) table contains name and
value pair that stores additional information for particular entity, thus you can store as
many properties as you want for a given entity. Getter and setter methods need to be
provided from the domain object so that we can represent these properties inside
domain objects.
Basic entities.
Basic entities such as User, Group, and Permissions along with Prop tables for each are
provided to persistent data for corresponding entities, Now as a business rule a group
contains multiple Users and One User can be a part of multiple Groups. Each entity,
User, Group, and Permission have UserProp, GroupProp and PremissionProp respectively.
The relation between Entity and Prop is one to many. E.g. User can have multiple
Properties. (For simplicity, Permission tables are not shown in the model)
Categories and Documents
Category refers to a Folder/Directory like structure on the file system. Each category
may or may not have its Parent Category. Category contains information like name,
description, creation details, modification deleted and deletion details. Each category
can have multiple entries. (Each Folder can contain one or more Documents (Entries) in
it. Each Document can have one or more versions in it.(Document corresponds to
version). Document contains information such as Title, Body, Summary, life cycle
details, version number, keywords, workflow status, Entry details and Attachment
details; Document also contains properties associated with it. Attachment is a file
associated with each Document, Database stores the name of file stored on the file
system and the size of Attachment.
--Drop Tables
DROP TABLE "APP"."ATTACHMENT";
DROP TABLE "APP"."CATEGORY";
DROP TABLE "APP"."CATEGORY_PROP";
DROP TABLE "APP"."DOCUMENT";
DROP TABLE "APP"."DOCUMENT_ATTACHMENT";
DROP TABLE "APP"."DOCUMENT_KEYWORDS";
DROP TABLE "APP"."DOCUMENT_PROP";
DROP TABLE "APP"."ENTRY";
DROP TABLE "APP"."GROUP";
DROP TABLE "APP"."GROUP_PROP";
DROP TABLE "APP"."IDGENERATOR";
DROP TABLE "APP"."KEYWORD";
DROP TABLE "APP"."USER";
DROP TABLE "APP"."USER_GROUP";
DROP TABLE "APP"."USER_PROP";
-- Table: "APP"."ATTACHMENT"
CREATE TABLE "APP"."ATTACHMENT"
(
"ATTACHMENT_ID" numeric NOT NULL,
"DOCUMENT_ID" numeric,
"ATTACHMEMT_PATH" varchar,
"ATTACHMENT_SIZE" numeric,
CONSTRAINT "ATTACHMENT_pkey" PRIMARY KEY ("ATTACHMENT_ID")
);
-- Table: "APP"."CATEGORY"
CREATE TABLE "APP"."CATEGORY"
(
"CATAGORY_ID" numeric NOT NULL,
"CATEGORY_NAME" varchar,
"CATEGORY_DESCRIPTION" varchar,
"CREATED_BY" numeric,
"CREATION_DATE" date,
"MODIFIED_BY" numeric,
"MODIFICATION_DATE" date,
"DELETED_BY" numeric,
"DELETE_DATE" date,
"PARENT_CATAGORY" numeric,
CONSTRAINT "CATEGORY_pkey" PRIMARY KEY ("CATAGORY_ID"),
CONSTRAINT "CATEGORY_PARENT_CATAGORY_fkey" FOREIGN KEY
("PARENT_CATAGORY") REFERENCES "APP"."CATEGORY" ("CATAGORY_ID") ON
UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT authorfk FOREIGN KEY ("CREATED_BY") REFERENCES "APP"."USER"
("USER_ID") ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT deletorfk FOREIGN KEY ("DELETED_BY") REFERENCES "APP"."USER"
("USER_ID") ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT editorfk FOREIGN KEY ("MODIFIED_BY") REFERENCES "APP"."USER"
("USER_ID") ON UPDATE NO ACTION ON DELETE NO ACTION
);
-- Table: "APP"."CATEGORY_PROP"
CREATE TABLE "APP"."CATEGORY_PROP"
(
"CATEGORY_PROP_ID" numeric NOT NULL,
"CATEGORY_ID" numeric,
"PROP_NAME" varchar,
"PROP_VALUE" varchar,
CONSTRAINT "CATEGORY_PROP_pkey" PRIMARY KEY ("CATEGORY_PROP_ID"),
CONSTRAINT "CATEGORY_PROP_CATEGORY_ID_fkey" FOREIGN KEY
("CATEGORY_ID") REFERENCES "APP"."CATEGORY" ("CATAGORY_ID") ON UPDATE
NO ACTION ON DELETE NO ACTION
);
-- Table: "APP"."DOCUMENT"
CREATE TABLE "APP"."DOCUMENT"
(
"DOCUMENT_ID" numeric NOT NULL,
"DOCUMENT_TITLE" varchar,
"DOCUMENT_BODY" varchar,
"DOCUMENT_SUMMARY" varchar,
"CREATED_BY" numeric,
"CREATION_DATE" date,
"MODIFIED_BY" numeric,
"MODIFICATION_DATE" date,
"DELETED_BY" numeric,
"DELETED_DATE" date,
"DOCUMENT_VERSION" numeric,
"DOCUMENT_STATUS" numeric,
"ENTRY_ID" numeric,
CONSTRAINT "DOCUMENT_pkey" PRIMARY KEY ("DOCUMENT_ID"),
CONSTRAINT "DOCUMENT_ENTRY_ID_fkey" FOREIGN KEY ("ENTRY_ID")
REFERENCES "APP"."ENTRY" ("ENTRY_ID") ON UPDATE NO ACTION ON DELETE NO
ACTION,
CONSTRAINT authorfk FOREIGN KEY ("CREATED_BY") REFERENCES "APP"."USER"
("USER_ID") ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT deletorfk FOREIGN KEY ("DELETED_BY") REFERENCES "APP"."USER"
("USER_ID") ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT editorfk FOREIGN KEY ("MODIFIED_BY") REFERENCES "APP"."USER"
("USER_ID") ON UPDATE NO ACTION ON DELETE NO ACTION
);
-- Table: "APP"."DOCUMENT_ATTACHMENT"
CREATE TABLE "APP"."DOCUMENT_ATTACHMENT"
(
"DOCUMENT_ATTACHMENT_ID" numeric NOT NULL,
"ATTACHMENT_ID" numeric,
"DOCUMENT_ID" numeric,
"ATTACHMENT_PATH" varchar,
"ATTACHMENT_SIZE" numeric,
CONSTRAINT "DOCUMENT_ATTACHMENT_pkey" PRIMARY KEY
("DOCUMENT_ATTACHMENT_ID"),
CONSTRAINT "DOCUMENT_ATTACHMENT_ATTACHMENT_ID_fkey" FOREIGN KEY
("ATTACHMENT_ID") REFERENCES "APP"."ATTACHMENT" ("ATTACHMENT_ID") ON
UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT "DOCUMENT_ATTACHMENT_DOCUMENT_ID_fkey" FOREIGN KEY
("DOCUMENT_ID") REFERENCES "APP"."DOCUMENT" ("DOCUMENT_ID") ON
UPDATE NO ACTION ON DELETE NO ACTION
);
-- Table: "APP"."DOCUMENT_KEYWORDS"
CREATE TABLE "APP"."DOCUMENT_KEYWORDS"
(
"DOCUMENT_KEYWORD_ID" numeric NOT NULL,
"DOCUMENT_ID" numeric,
"KEYWORD_ID" numeric,
z CONSTRAINT "DOCUMENT_KEYWORDS_pkey" PRIMARY KEY
("DOCUMENT_KEYWORD_ID"),
CONSTRAINT "DOCUMENT_KEYWORDS_DOCUMENT_ID_fkey" FOREIGN KEY
("DOCUMENT_ID") REFERENCES "APP"."DOCUMENT" ("DOCUMENT_ID") ON
UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT keywordidfk FOREIGN KEY ("KEYWORD_ID") REFERENCES
"APP"."KEYWORD" ("KEYWORD_ID") ON UPDATE NO ACTION ON DELETE NO
ACTION
);
-- Table: "APP"."DOCUMENT_PROP"
CREATE TABLE "APP"."DOCUMENT_PROP"
(
document_prop_id numeric NOT NULL,
document_id numeric NOT NULL,
prop_name varchar NOT NULL,
prop_value varchar,
prop_value_details varchar,
CONSTRAINT "DOCUMENT_PROP_pkey" PRIMARY KEY (document_prop_id),
CONSTRAINT "DOCUMENT_PROP_document_id_fkey" FOREIGN KEY (document_id)
REFERENCES "APP"."DOCUMENT" ("DOCUMENT_ID") ON UPDATE NO ACTION ON
DELETE NO ACTION
);
-- Table: "APP"."ENTRY"
CREATE TABLE "APP"."ENTRY"
(
"ENTRY_ID" numeric NOT NULL,
"CATEGORY_ID" numeric,
CONSTRAINT "ENTRY_pkey" PRIMARY KEY ("ENTRY_ID"),
CONSTRAINT "ENTRY_CATEGORY_ID_fkey" FOREIGN KEY ("CATEGORY_ID")
REFERENCES "APP"."CATEGORY" ("CATAGORY_ID") ON UPDATE NO ACTION ON
DELETE NO ACTION
);
-- Table: "APP"."GROUP"
CREATE TABLE "APP"."GROUP"
(
"GROUP_ID" numeric NOT NULL,
"GROUP_NAME" varchar,
"GROUP_DESCRIPTION" varchar,
"CREATED_BY" numeric,
"CREATION_DATE" date,
"MODIFIED_BY" numeric,
"MODIFICATION_DATE" date,
"DELETED_BY" numeric,
"DELETE_DATE" date,
CONSTRAINT "GROUP_ID_pk" PRIMARY KEY ("GROUP_ID") USING INDEX
TABLESPACE apptablespace
);
-- Table: "APP"."GROUP_PROP"
CREATE TABLE "APP"."GROUP_PROP"
(
group_prop_id numeric NOT NULL,
group_id numeric NOT NULL,
prop_name varchar NOT NULL,
prop_value varchar,
prop_value_details varchar,
CONSTRAINT "GROUP_PROP_pkey" PRIMARY KEY (group_prop_id),
CONSTRAINT "GROUP_PROP_group_id_fkey" FOREIGN KEY (group_id)
REFERENCES "APP"."GROUP" ("GROUP_ID") ON UPDATE NO ACTION ON DELETE
NO ACTION
);
-- Table: "APP"."IDGENERATOR"
CREATE TABLE "APP"."IDGENERATOR"
(
id numeric NOT NULL,
next_value numeric NOT NULL,
CONSTRAINT "IDGENERATOR_pkey" PRIMARY KEY (id)
);
--
Table: "APP"."KEYWORD"
CREATE TABLE "APP"."KEYWORD"
(
"KEYWORD_ID" numeric NOT NULL,
"KEYWORD_NAME" varchar,
"KEYWORD_DESCRIPTION" varchar,
CONSTRAINT "KEYWORD_pkey" PRIMARY KEY ("KEYWORD_ID")
);
-- Table: "APP"."USER"
CREATE TABLE "APP"."USER"
(
"USER_ID" numeric NOT NULL,
"USER_NAME" varchar,
"USER_PASSWORD" varchar,
"USER_FIRST_NAME" varchar,
"USER_LAST_NAME" varchar,
"CREATION_DATE" date,
"CREATED_BY" numeric,
"MODIFICATION_DATE" date,
"MODIFIED_BY" numeric,
"DELETE_DATE" date,
"DELETED_BY" numeric,
CONSTRAINT "USER_pkey" PRIMARY KEY ("USER_ID")
);
-- Table: "APP"."USER_GROUP"
CREATE TABLE "APP"."USER_GROUP"
(
"USER_GROUP" numeric NOT NULL,
"USER_ID" numeric,
"GROUP_ID" numeric,
CONSTRAINT "USER_GROUP_pkey" PRIMARY KEY ("USER_GROUP"),
CONSTRAINT "USER_GROUP_GROUP_ID_fkey" FOREIGN KEY ("GROUP_ID")
REFERENCES "APP"."GROUP" ("GROUP_ID") ON UPDATE NO ACTION ON DELETE
NO ACTION,
CONSTRAINT "USER_GROUP_USER_ID_fkey" FOREIGN KEY ("USER_ID")
REFERENCES "APP"."USER" ("USER_ID") ON UPDATE NO ACTION ON DELETE NO
ACTION
);
-- Table: "APP"."USER_PROP"
CREATE TABLE "APP"."USER_PROP"
(
user_prop_id numeric NOT NULL,
user_id numeric NOT NULL,
prop_name varchar NOT NULL,
prop_value varchar,
prop_value_details varchar,
CONSTRAINT "USER_PROP_pkey" PRIMARY KEY (user_prop_id),
CONSTRAINT "USER_PROP_user_id_fkey" FOREIGN KEY (user_id) REFERENCES
"APP"."USER" ("USER_ID") ON UPDATE NO ACTION ON DELETE NO ACTION
);
hbm files
User.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="org.applabs.base.User" table="USER">
<id column="USER_ID" name="id" type="java.lang.Long">
<generator class="org.hibernate.id.TableHiLoGenerator">
<param name="table">idgen</param>
<param name="column">NEXT</param>
</generator>
</id>
UserProp.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="org.applabs.base.UserProp" table="USER_PROP">
<id column="USER_PROP_ID" name="id" type="java.lang.Long">
<generator class="org.hibernate.id.TableHiLoGenerator">
<param name="table">idgen</param>
<param name="column">NEXT</param>
</generator>
</id>
Category.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="org.applabs.base.Category" table="CATEGORY">
<id column="CATAGORY_ID" name="id" type="java.lang.Long">
<generator class="org.hibernate.id.TableHiLoGenerator">
<param name="table">idgen</param>
<param name="column">NEXT</param>
</generator>
</id>
CategoryProp.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="org.applabs.base.CategoryProp" table="CATEGORY_PROP">
<id column="CATEGORY_PROP_ID" name="id" type="java.lang.Long">
<generator class="org.hibernate.id.TableHiLoGenerator">
<param name="table">idgen</param>
<param name="column">NEXT</param>
</generator>
</id>
<property column="CATEGORY_ID" name="categoryId"
type="java.lang.Long"/>
<property column="PROP_NAME" name="propName"
type="java.lang.String"/>
<property column="PROP_VALUE" name="propValue"
type="java.lang.String"/>
</set>
</class>
</hibernate-mapping>
Document.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="org.applabs.base.Document" table="DOCUMENT">
</class>
</hibernate-mapping>
DocumentProp.hbm.xml