Home » Eclipse Projects » EclipseLink » EclipseLink as alternative to Hibernate in Swing App
EclipseLink as alternative to Hibernate in Swing App [message #384245] |
Fri, 12 December 2008 00:55 |
David J Rericha Messages: 13 Registered: July 2009 |
Junior Member |
|
|
Dear members,
I have developed a production Swing app in the medical field using
Hibernate as the persistence layer. Even though Hibernate is geared
towards web-apps, it has been very adaptable to the 2-tier world with one
exception: lazy-loading. Since lazy-loading is unsupported outside a
transaction in Hibernate, I have implemented a framework that always
maintains an open transaction with the current session. However, these
long transactions still do not stave off seemingly random
LazyInitializationException's when performing lazy-loads.
My question is will I run into the same problem with EclipseLink? From
what I garnered from the documentation, fetching in EclipseLink does not
need to be wrapped in an EntityManager transaction(1). Also, any
recommended implementation-patterns of EclipseLink in a GUI app would be
much appreciated.
Thanks,
David
1 - Das, Aditi. "Understanding JPA, Part 1: The object-oriented paradigm
of data persistence." JavaWorld.com, 01/17/08:
"EntityManager manages entities; it is responsible for their addition,
updating, and deletion. You can find an entity without a transaction;
however, add, update, and delete operations need to be within a
transaction."
|
|
|
Re: EclipseLink as alternative to Hibernate in Swing App [message #384247 is a reply to message #384245] |
Fri, 12 December 2008 06:39 |
Tom Eugelink Messages: 825 Registered: July 2009 |
Senior Member |
|
|
Eclipselink works perfectly in two tier environments. My setup currently does all changes outside a transaction in memory and when the save button is pressed I merges all entites that were changes and everything is persisted. I did have to tweak some behavior in an ExtendedEntityManager and that has to do with what happens when exceptions occur during save; when that happens you need to clear the EM in order to get rid of the entities that have already been persisted (and have their version increased), but by doing so you also lose objects that are supposed to be removed. I can give you my two classes that handle these scenario's.
Tom
David J Rericha wrote:
> Dear members,
>
> I have developed a production Swing app in the medical field using
> Hibernate as the persistence layer. Even though Hibernate is geared
> towards web-apps, it has been very adaptable to the 2-tier world with
> one exception: lazy-loading. Since lazy-loading is unsupported outside
> a transaction in Hibernate, I have implemented a framework that always
> maintains an open transaction with the current session. However, these
> long transactions still do not stave off seemingly random
> LazyInitializationException's when performing lazy-loads.
>
> My question is will I run into the same problem with EclipseLink? From
> what I garnered from the documentation, fetching in EclipseLink does not
> need to be wrapped in an EntityManager transaction(1). Also, any
> recommended implementation-patterns of EclipseLink in a GUI app would be
> much appreciated.
>
> Thanks,
>
>
> David
>
> 1 - Das, Aditi. "Understanding JPA, Part 1: The object-oriented paradigm
> of data persistence." JavaWorld.com, 01/17/08:
>
> "EntityManager manages entities; it is responsible for their addition,
> updating, and deletion. You can find an entity without a transaction;
> however, add, update, and delete operations need to be within a
> transaction."
|
|
|
Re: EclipseLink as alternative to Hibernate in Swing App [message #384256 is a reply to message #384247] |
Fri, 12 December 2008 19:07 |
David J Rericha Messages: 13 Registered: July 2009 |
Junior Member |
|
|
Tom,
Thanks for the response. It is good to hear of your success with
EclipseLink in 2-tier. I created a test app in Eclipse-Ganymede using
Dali - just a Person entity associated many-to-one with an Address entity.
I wanted to test lazy-loading. However, even though I specified "Lazy"
for the address entity in the orm.xml, the entity is loaded anyway. Is
there a problem with lazy-loading or am I missing something? The
Server-Client session is used. I know I need a DatabaseSession, but I am
not sure how to configure that. Maybe that is the problem. My source is
below:
EclipseLink, version: Eclipse Persistence Services - 1.0.2 (Build 20081024)
JavaSE 1.6.0_11
Eclipse Platform 3.4.1
WST (Dali) 3.0.3
Models:
public class Address implements Serializable
{
private long id;
private String city;
private String country;
private String startOrProvince;
private String postalCode;
private String street;
private static final long serialVersionUID = 1L;
//Getters & setters...
}
public class Person implements Serializable
{
private long id;
private String firstName;
private String lastName;
private Address address;
private static final long serialVersionUID = 1L;
public String toString()
{
return firstName + " " + lastName;
}
//Getters & setters...
}
Main:
public class TryQuickStart
{
public static void main( String[] args )
{
Map properties = new HashMap();
EntityManagerFactory emf = Persistence.createEntityManagerFactory(
"quickstart", properties );
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
Person david = (Person)em.createQuery(
"select p from Person p where p.firstName = 'David'"
).getSingleResult();
System.out.println( david );
em.getTransaction().commit();
em.close();
}
}
Here is the log:
EL Config]: 2008.12.12
12:50:04.813--ServerSession(17386824)--Connection(9613729)-- Thread(Thread[main,5,main])--Connected:
jdbc:postgresql://localhost/quickstart
User: postgres
Database: PostgreSQL Version: 8.1.8
Driver: PostgreSQL Native Driver Version: PostgreSQL 8.3 JDBC4 with SSL
(build 604)
[EL Finest]: 2008.12.12
12:50:04.816--ServerSession(17386824)--Thread(Thread[main,5, main])--sequencing
connected, state is Preallocation_NoTransaction_State
[EL Finest]: 2008.12.12
12:50:04.817--ServerSession(17386824)--Thread(Thread[main,5, main])--sequence
address_seq: preallocation size 1
[EL Finest]: 2008.12.12
12:50:04.817--ServerSession(17386824)--Thread(Thread[main,5, main])--sequence
person_seq: preallocation size 1
[EL Info]: 2008.12.12
12:50:04.858--ServerSession(17386824)--Thread(Thread[main,5, main])--file:/home/daver/workspace/quickstart/build/classes/ -quickstart
login successful
[EL Finest]: 2008.12.12
12:50:04.858--ServerSession(17386824)--Thread(Thread[main,5, main])--End
deploying Persistence Unit quickstart; state Deployed; factoryCount 1
[EL Finer]: 2008.12.12
12:50:04.877--ServerSession(17386824)--Thread(Thread[main,5, main])--client
acquired
[EL Finest]: 2008.12.12
12:50:05.091--UnitOfWork(23978087)--Thread(Thread[main,5,mai n])--Execute
query ReadAllQuery(quickstart.demo.model.Person)
[EL Fine]: 2008.12.12
12:50:05.094--ServerSession(17386824)--Connection(25218858)- -Thread(Thread[main,5,main])--SELECT
ID, FIRSTNAME, LASTNAME, address_id FROM person WHERE (FIRSTNAME = ?)
bind => [David]
[EL Finest]: 2008.12.12
12:50:05.137--ServerSession(17386824)--Thread(Thread[main,5, main])--Execute
query ReadObjectQuery(quickstart.demo.model.Address)
[EL Fine]: 2008.12.12
12:50:05.138--ServerSession(17386824)--Connection(9820728)-- Thread(Thread[main,5,main])--SELECT
address_id, province, CITY, COUNTRY, p_code, STREET FROM address WHERE
(address_id = ?)
bind => [2]
[EL Finest]: 2008.12.12
12:50:05.142--UnitOfWork(23978087)--Thread(Thread[main,5,mai n])--Register
the existing object David Rericha
[EL Finest]: 2008.12.12
12:50:05.148--UnitOfWork(23978087)--Thread(Thread[main,5,mai n])--Register
the existing object quickstart.demo.model.Address@132ae7
David Rericha
[EL Finer]: 2008.12.12
12:50:05.150--UnitOfWork(23978087)--Thread(Thread[main,5,mai n])--release
unit of work
[EL Finer]: 2008.12.12
12:50:05.150--ClientSession(21132756)--Thread(Thread[main,5, main])--client
released
orm.xml:
<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm
http://java.sun.com/xml/ns/persistence/orm_1_0.xsd" version="1.0">
<entity class="quickstart.demo.model.Address" access="PROPERTY">
<table name="address">
</table>
<attributes>
<id name="id">
<column name="address_id"/>
<generated-value generator="address_seq" strategy="SEQUENCE"/>
<sequence-generator name="address_seq" allocation-size="1"
initial-value="1"/>
</id>
<basic name="startOrProvince">
<column name="province"/>
</basic>
<basic name="city">
</basic>
<basic name="country">
</basic>
<basic name="postalCode">
<column name="p_code"/>
</basic>
<basic name="street">
</basic>
</attributes>
</entity>
<entity class="quickstart.demo.model.Person" access="PROPERTY">
<table name="person">
</table>
<attributes>
<id name="id">
<generated-value generator="person_seq" strategy="SEQUENCE"/>
<sequence-generator name="person_seq" allocation-size="1"
initial-value="1"/>
</id>
<basic name="firstName">
</basic>
<basic name="lastName">
</basic>
<many-to-one name="address" fetch="LAZY">
<join-column name="address_id" referenced-column-name="address_id"/>
<cascade>
<cascade-all />
</cascade>
</many-to-one>
</attributes>
</entity>
</entity-mappings>
persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="quickstart" transaction-type="RESOURCE_LOCAL">
<mapping-file>META-INF/orm.xml</mapping-file>
<properties>
<property name="eclipselink.jdbc.url"
value="jdbc:postgresql://localhost/quickstart"/>
<property name="eclipselink.jdbc.user" value="postgres"/>
<property name="eclipselink.jdbc.password" value=""/>
<property name="eclipselink.jdbc.driver" value="org.postgresql.Driver"/>
<property name="eclipselink.logging.level" value="FINEST"/>
<property name="eclipselink.ddl-generation.output-mode"
value="database" />
<property name="eclipselink.target-database" value="PostgreSQL"/>
</properties>
</persistence-unit>
</persistence>
|
|
| | | | |
Goto Forum:
Current Time: Fri Sep 20 00:29:20 GMT 2024
Powered by FUDForum. Page generated in 0.04912 seconds
|