|
Emerging Technology
Fall Semester, 2004 Joins & Many-to-One |
|
|---|---|---|
|
© 2004, All Rights Reserved, SDSU & Roger Whitney San Diego State University -- This page last updated 30-Nov-04 |
CS 683 Emerging Technologies Fall Semester, 2004 Doc 31 Joins & Many-to-One
Write, Update & Delete Cascading
Copyright ©, All rights reserved. 2004 SDSU & Roger Whitney, 5500 Campanile Drive, San Diego, CA 92182-7700 USA. OpenContent ( http://www.opencontent.org/opl.shtml) license defines the copyright on this document
| CS 683 Fall 04 | Doc 31, Joins & Many-to-One Slide # 2 |
Hibernate Reference 2.1.6
Online html version http://www.hibernate.org/hib_docs/reference/en/html/
Other versions (including Chinese) at: http://www.hibernate.org/5.html
Hibernate in Action, Bauer & King
Log4j Documentation, http://logging.apache.org/log4j/docs/
| CS 683 Fall 04 | Doc 31, Joins & Many-to-One Slide # 3 |
|
id |
first_name |
last_name |
|
1 |
Roger |
Whitney |
|
2 |
Leland |
Beck |
|
3 |
Carl |
Eckberg |
|
id |
user_name |
host |
person_id |
|
1 |
beck |
cs.sdsu.edu |
2 |
|
2 |
whitney |
cs.sdsu.edu |
1 |
|
3 |
whitney |
rohan.sdsu.edu |
1 |
|
4 |
foo |
rohan.sdsu.edu |
|
The tables have a column in common as email_addresses.person_id refers to people.id. So we can create a new table by joining the two tables together on that column
| CS 683 Fall 04 | Doc 31, Joins & Many-to-One Slide # 4 |
Only uses entries linked in two tables
|
first_name |
last_name |
user_name |
host |
|
Leland |
Beck |
beck |
cs.sdsu.edu |
|
Roger |
Whitney |
whitney |
cs.sdsu.edu |
|
Roger |
Whitney |
whitney |
rohan.sdsu.edu |
select first_name, last_name, user_name, host from people, email_addresses where people.id = email_addresses.person_id;
or equivalently
select first_name, last_name, user_name, host from people inner join email_addresses on (people.id = email_addresses.person_id);
| CS 683 Fall 04 | Doc 31, Joins & Many-to-One Slide # 5 |
Uses all entries from a table
Use all entries from the left table
|
first_name |
last_name |
user_name |
host |
|
Leland |
Beck |
beck |
cs.sdsu.edu |
|
Roger |
Whitney |
whitney |
cs.sdsu.edu |
|
Roger |
Whitney |
whitney |
rohan.sdsu.edu |
|
Carl |
Eckberg |
|
|
select first_name, last_name, user_name, host from people left outer join email_addresses on (people.id = email_addresses.person_id);
| CS 683 Fall 04 | Doc 31, Joins & Many-to-One Slide # 6 |
|
first_name |
last_name |
user_name |
host |
|
Leland |
Beck |
beck |
cs.sdsu.edu |
|
Roger |
Whitney |
whitney |
cs.sdsu.edu |
|
Roger |
Whitney |
whitney |
rohan.sdsu.edu |
|
|
|
foo |
rohan.sdsu.edu |
Use all entries from the right table
select first_name, last_name, user_name, host from people right outer join email_addresses on (people.id = email_addresses.person_id);
| CS 683 Fall 04 | Doc 31, Joins & Many-to-One Slide # 7 |
The following two statements are equivalent
select first_name, last_name, user_name, host from people right outer join email_addresses on (people.id = email_addresses.person_id);
select first_name, last_name, user_name, host from email_addresses left outer join people on (people.id = email_addresses.person_id);
| CS 683 Fall 04 | Doc 31, Joins & Many-to-One Slide # 8 |
public class Person {
String firstName;
String lastName;
Set addresses;
long id;
|
public class EmailAddress {
String userName;
String host;
Person owner;
long id;
|
| CS 683 Fall 04 | Doc 31, Joins & Many-to-One Slide # 9 |
|
id |
first_name |
last_name |
|
1 |
Roger |
Whitney |
|
2 |
Leland |
Beck |
|
3 |
Carl |
Eckberg |
|
id |
user_name |
host |
person_id |
|
1 |
beck |
cs.sdsu.edu |
2 |
|
2 |
whitney |
cs.sdsu.edu |
1 |
|
3 |
whitney |
rohan.sdsu.edu |
1 |
|
4 |
foo |
rohan.sdsu.edu |
|
CREATE TABLE PEOPLE ( ID serial NOT NULL , FIRST_NAME varchar(50) NULL , LAST_NAME varchar(50) NULL , CONSTRAINT PEOPLE_PK PRIMARY KEY (id), CONSTRAINT PEOPLE_UNIQ UNIQUE (id)) CREATE TABLE EMAIL_ADDRESSES ( USER_NAME varchar(50) NULL , HOST varchar(50) NULL , ID serial NOT NULL , PERSON_ID int4 NULL , CONSTRAINT EMAIL_ADDRESSES_PK PRIMARY KEY (id), CONSTRAINT EMAIL_ADDRESSES_UNIQ UNIQUE (id))
| CS 683 Fall 04 | Doc 31, Joins & Many-to-One Slide # 10 |
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
<hibernate-mapping package="cs683">
<class
name="EmailAddress"
table="EMAIL_ADDRESSES" >
<id
name="id"
type="long"
column="id">
<generator class="increment"/>
</id>
<property
name="userName"
column="user_name"
type="string"
not-null="false"
length="50"/>
<property
name="host"
column="host"
type="string"
not-null="false"
length="50" />
<many-to-one name="owner" column="person_id" class="Person" not-null="true">
</many-to-one>
</class>
</hibernate-mapping>
| CS 683 Fall 04 | Doc 31, Joins & Many-to-One Slide # 11 |
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
<hibernate-mapping package="cs683">
<class
name="Person"
table="people"
>
<id
name="id"
type="long"
column="id"
>
<generator class="increment"/>
</id>
<set name="addresses"
inverse="false"
cascade="all"
table="EMAIL_ADDRESSES">
<key column="person-id"/>
<one-to-many class="cs683.EmailAddress" />
</set>
| CS 683 Fall 04 | Doc 31, Joins & Many-to-One Slide # 12 |
<property
name="lastName"
column="last_name"
type="string"
not-null="false"
length="50"
/>
<property
name="firstName"
column="first_name"
type="string"
not-null="false"
length="50"
/>
</class>
</hibernate-mapping>
No changes from Document 30
| CS 683 Fall 04 | Doc 31, Joins & Many-to-One Slide # 13 |
static void sampleWrite() throws MappingException, HibernateException,
Exception
{
Session session = getHibernateSession();
Transaction save = null;
try
{
save = session.beginTransaction();
Person newPerson = new Person("Susan", "Many");
EmailAddress bar = new EmailAddress("foo", "bar.aol.com");
EmailAddress cat = new EmailAddress("catwoman", "gmail.com");
newPerson.addAddress(cat);
newPerson.addAddress(bar);
session.save(bar);
session.save(cat);
session.save(newPerson);
save.commit();
}
catch (Exception problem)
{
if (save != null)
save.rollback();
throw problem;
}
finally
{
session.close();
}
}
Set all the links before saving
| CS 683 Fall 04 | Doc 31, Joins & Many-to-One Slide # 14 |
static void sampleRead() throws MappingException, HibernateException,
Exception
{
String query = "select p from Person p join p.addresses address where
address.host like '%gmail%'"
Session session = getHibernateSession();
Query getGmailUser =
session.createQuery(query);
List result = getGmailUser.list();
System.out.println("Number of People: " + result.size());
Object first =result.get(0);
System.out.println( first);
session.close();
}
| CS 683 Fall 04 | Doc 31, Joins & Many-to-One Slide # 15 |
Select indicates which type of object to return
select address from Person p join p.addresses address where address host like ‘%gmail%’ select p from Person p join p.addresses address where address host like ‘%gmail%’
select p from Person p where p.lastName = 'Beck’
| CS 683 Fall 04 | Doc 31, Joins & Many-to-One Slide # 16 |
Hibernate supports
Join defaults to inner
The following are equivalent
select p from Person p join p.addresses address select p from Person p inner join p.addresses address
| CS 683 Fall 04 | Doc 31, Joins & Many-to-One Slide # 17 |
The left join will get Eckberg
select p from Person p left join p.addresses address where address host like ‘%gmail%’ or p.lastName like ‘E%’
The right join will not get Eckberg
select p from Person p right join p.addresses address where address host like ‘%gmail%’ or p.lastName like ‘E%’
|
id |
first_name |
last_name |
|
1 |
Roger |
Whitney |
|
2 |
Leland |
Beck |
|
3 |
Carl |
Eckberg |
|
id |
user_name |
host |
person_id |
|
1 |
beck |
cs.sdsu.edu |
2 |
|
2 |
whitney |
cs.sdsu.edu |
1 |
|
3 |
whitney |
rohan.sdsu.edu |
1 |
|
4 |
foo |
rohan.sdsu.edu |
|
| CS 683 Fall 04 | Doc 31, Joins & Many-to-One Slide # 18 |
select p, address from Person p join p.addresses address
Session session = getHibernateSession();
Query getGmailUser = session
.createQuery("select p, address from Person p join p.addresses address");
List result = getGmailUser.list();
System.out.println("Number of People: " + result.size());
for (int k = 0; k < result.size(); k++)
{
Object[] resultArray = (Object[]) result.get(k);
Person personResult = (Person) resultArray[0];
EmailAddress addressResult = (EmailAddress) resultArray[1];
System.out.println("" + personResult + " " + addressResult);
}
session.close();
| CS 683 Fall 04 | Doc 31, Joins & Many-to-One Slide # 19 |
static void sampleUpdate() throws MappingException, HibernateException,
Exception
{
Session session = getHibernateSession();
Transaction update = session.beginTransaction();
Query getGmailUser = session.createQuery(
"select p from Person p join p.addresses address where
address.host='gmail.com'") ;
List result = getGmailUser.list();
Person gmailUser = (Person) result.get(0);
gmailUser.setFirstName("Roger");
Iterator listEmails = gmailUser.getAddresses().iterator();
while (listEmails.hasNext())
{
EmailAddress anAddress =(EmailAddress) listEmails.next();
if (anAddress.getHost().equals("gmail.com"))
anAddress.setHost("gmail.google.com");
}
update.commit();
session.close();
}
| CS 683 Fall 04 | Doc 31, Joins & Many-to-One Slide # 20 |
static void sampleDelete() throws MappingException, HibernateException,
Exception
{
Session session = getHibernateSession();
Transaction deleter = null;
try
{
deleter = session.beginTransaction();
Query getGmailUser = session.createQuery(
"select p from Person p join p.addresses address where
address.host like '%gmail%'");
Person result = (Person) getGmailUser.uniqueResult();
session.delete(result);
deleter.commit();
}
catch (Exception problem)
{
if (deleter != null) deleter.rollback();
throw problem;
}
finally
{
session.close();
}
}
Does this delete the email addresses?
| CS 683 Fall 04 | Doc 31, Joins & Many-to-One Slide # 21 |
<set
name="addresses"
inverse="false"
cascade="all"
table="EMAIL_ADDRESSES">
<key column="person_id"/>
<one-to-many class="cs683.EmailAddress" />
</set>
all – cascade write, update & delete
none – no cascading
save-update – cascade only update & save
delete – cascade only deletes
| CS 683 Fall 04 | Doc 31, Joins & Many-to-One Slide # 22 |
Hibernate API http://www.hibernate.org/hib_docs/api/
Session API http://www.hibernate.org/hib_docs/api/net/sf/hibernate/Session.html
int delete(String query) throws HibernateException
Delete all objects returned by the query
public Iterator iterate(String query) throws HibernateException
Execute a query and return the results in an iterator.
public void saveOrUpdate(Object object)
throws HibernateException
Either save() or update() the given instance, depending upon the value of its identifier property
| CS 683 Fall 04 | Doc 31, Joins & Many-to-One Slide # 23 |
Main Web site http://logging.apache.org/log4j/docs/
Defines 5 levels of logging (from weak to strong)
Logging methods
Can set
DEBUG < INFO < WARN < ERROR < FATAL
| CS 683 Fall 04 | Doc 31, Joins & Many-to-One Slide # 24 |
import org.apache.log4j.Logger;
public class Foo
{
static Logger log = Logger.getLogger(Foo.class);
public static void main(String[] args) throws Exception
{
log.info("Starting Foo.main" + Foo.class);
new Foo().sampleMethod();
log.info("End Foo.main");
}
public void sampleMethod() throws Exception
{
int x =0;
int y = 1;
try
{
int z = y/x;
}
catch (Exception e)
{
log.fatal("In Sample",e);
throw e;
}
}
}
| CS 683 Fall 04 | Doc 31, Joins & Many-to-One Slide # 25 |
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.rootLogger=off, stdout
log4j.logger.cs683=error
log4j.properties file placed in a directory in the classpath
Can read file manually
Set log levels per package
Loggers inherit values from parent logger
RootLogger is ancestor of all loggers
Order of logging levels
ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF
| CS 683 Fall 04 | Doc 31, Joins & Many-to-One Slide # 26 |
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### direct messages to file hibernate.log ###
#log4j.appender.file=org.apache.log4j.FileAppender
#log4j.appender.file.File=hibernate.log
#log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### set log levels - for more verbose logging change 'info' to 'debug' ###
log4j.rootLogger=off, stdout
log4j.logger.net.sf.hibernate=off
### log just the SQL
log4j.logger.net.sf.hibernate.SQL=debug
### log JDBC bind parameters ###
log4j.logger.net.sf.hibernate.type=off
### log schema export/update ###
log4j.logger.net.sf.hibernate.tool.hbm2ddl=debug
### log cache activity ###
#log4j.logger.net.sf.hibernate.cache=debug
| CS 683 Fall 04 | Doc 31, Joins & Many-to-One Slide # 27 |
static void sampleDelete() throws MappingException, HibernateException,
Exception
{
log.debug("Enter delete");
Session session = getHibernateSession();
Transaction deleter = null;
try
{
deleter = session.beginTransaction();
session.delete("select p from Person p join p.addresses address
where address.host like '%gmail%'");
deleter.commit();
}
catch (Exception problem)
{
if (deleter != null)
deleter.rollback();
log.error("Delete problem", problem);
throw problem;
}
finally
{
session.close();
}
log.debug("Exit delete");
}
Copyright ©, All rights reserved.
2004 SDSU & Roger Whitney, 5500 Campanile Drive, San Diego, CA 92182-7700 USA.
OpenContent license defines the copyright on this document.