290 likes | 431 Views
Hibernate utvikling i praksis. JavaZone 2004 Eivind Waaler, Bekk – 15.09.2004. Versjon 1.0. Agenda. Introduksjon til Hibernate Utviklingsteknikker Deployment Noen erfaringer Fremtidsutsikter. Hibernate. XML. XML. DB. POJO. POJO. Introduksjon. ORM rammeverk
E N D
Hibernate utvikling i praksis JavaZone 2004 Eivind Waaler, Bekk – 15.09.2004 Versjon 1.0
Agenda • Introduksjon til Hibernate • Utviklingsteknikker • Deployment • Noen erfaringer • Fremtidsutsikter
Hibernate XML XML DB POJO POJO Introduksjon • ORM rammeverk • Javaobjekter (POJO) Databasetabeller • VO/DTO ut – Domenemodellen returnerer! • Svært populært – ”standard” i OS miljøer • Versjon 1.0 – september 2002 • Versjon 2.0 – juli 2003 • Versjon 2.1 – desember 2003 • Versjon 2.1.6 – august 2004 • Versjon 3.0 – 2004/2005 • XML mappingfiler • Klasse mot tabell • Felter mot kolonner • Relasjoner mot fremmednøkler • ++ all mapping informasjon
Introduksjon • Sesjoner • CRUD operasjoner • Spørringer • Objekter – transient/persistent • Ikke trådsikker! • SessionFactory • Spørringer • HQL – Hibernate Query Language • Criteria API • Native SQL • Transaksjoner – TransactionFactory
XML POJO XML POJO XML POJO XML POJO XML POJO DDL Utviklingsteknikker/Verktøy • Skrive alt selv • middle-out – XML • top-down – Javakode • bottom-up – Database • Verktøy • hbm2java • SchemaExport • SchemaUpdate • XDoclet • Middlegen
DDL XML POJO Utviklingsteknikker – middle-out • ”Vanligste” teknikken • XML mapping • Verktøy • hbm2java – Java filer (POJO) • SchemaExport/SchemaUpdate – SQL DDL (fil eller db oppdatering) • Fordeler • Kun Hibernate verktøy • DTD • Ulemper • Skrive XML • Utvide klasser
Utviklingsteknikker – middle-out <hibernate-mapping> <class name="domain.Report"table="REPORTS"dynamic-update="false"> <id name="id"column="ID"type="int"> <generator class="identity"/> </id> <property name="name" type="java.lang.String" column="NAME" ... <set name="documents" lazy="false" inverse="true" cascade="all-delete-orphan" sort="unsorted" > ...
POJO XML DDL Utviklingsteknikker – top-down • Arbeide med kode • Java klassefiler • Verktøy • XDoclet – XML mappingfiler • SchemaExport/SchemaUpdate – SQL DDL • Fordeler • Skrive Javakode! • Utvide klasser • Ulemper • XDoclet – ekstra verktøy • Min favoritt!
Utviklingsteknikker – top-down /** * @hibernate.class table="REPORTS" * @hibernate.query * name="ReportByPerson" * query="select report from Report report where report.person.id = ?" */ public class Report extends HibernateDomainObject { /** * Get the documents for this report. * @return Returns the documents. * @hibernate.set lazy="false" inverse="true" cascade="all-delete-orphan" * @hibernate.collection-key column="REPORT_ID_FK" * @hibernate.collection-one-to-many class="domain.Document" */ public Set getDocuments() { return_documents; } ...
DB XML POJO Utviklingsteknikker – bottom-up • Databasemodell m/relasjoner • Verktøy • Middlegen – XML mapping filer • hbm2java – Java filer • Fordeler • Eksisterende database • Lite feil! • Mye bra DB-verktøy • Ulemper • Middlegen – ekstra verktøy • Erfaringer prosjekt • Kompleks dbmodell m. >100 tabeller • ~ halv dag komplett Hibernate lag
Deployment • Standard • JBoss SAR/JMX MBean • Spring (NASA Art)
Deployment – Standard config • Standard • hibernate.properties • Config i kode: • Alternativt – XML config • hibernate.cfg.xml • Databaseinnstillinger • Liste mappingfiler Configuration cfg = new Configuration(); cfg.addClass(airline.hibernate.Person.class); cfg.addClass(airline.hibernate.Flight.class); cfg.addClass(airline.hibernate.Reservation.class); SessionFactory factory = cfg.buildSessionFactory(); SessionFactory sf = new Configuration().configure().buildSessionFactory();
Deployment – MBean/JBoss SAR • Hibernate JBoss • MBean – SessionFactory oppretting • Alt pakkes i en SAR fil (Service Archive) • Hibernate mappings • POJO klasser • DD – jboss-service.xml • jboss-service.xml • DataSource JNDI navn • Factory JNDI navn • Dialect settings • Liste av mappings • XDoclet støtte • JMX • Runtime config
J2SE client WebApp JBoss EJB facade SAR DB Deployment – MBean/JBoss SAR • SessionFactory tilgjengelig via JNDI: • Fordeler med MBean • Støtter CMT (Stateless Session Bean – façade) • Appserver styrer Connection Pooling • Runtime config • Middlegen/XDoclet • Eksisterende database komplett SAR fil • JBoss 3.2.6 HAR (Hibernate Archive) • HAR Deployer – multiple MBean • hibernate-service.xml • Sesjonshåndtering – SessionContext.getSession(…) InitialContext ctx = new InitialContext(); SessionFactory factory = (SessionFactory)ctx.lookup("java:/hibernate/SessionFactory"); Session session = factory.getSession();
Deployment – Spring • Springframework • Lettvektsrammeverk • Dependency Injection – Avhengighetsinnsprøytning • AOP • Fordeler • Unchecked exceptions • Declarative transactions • Logisk lagdeling • Enhetstesting • HibernateTemplate/HibernateDAOSupport • Forhold til MBean/SAR • Ingen container påkrevd • Kan benyttes fra alle Java applikasjoner • Trond Arve Wasskog – Open Source Agile Architecture
Deployment – Spring • Konfigurasjon SessionFactory • DataSource + mapping filer • DAO refererer til mySessionFactory <bean id="mySessionFactory"class="org.springframework.orm.hibernate.LocalSessionFactoryBean"> <property name="mappingResources"> <list> <value>product.hbm.xml</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">net.sf.hibernate.dialect.MySQLDialect</prop> </props> </property> <property name="dataSource"> <ref bean="myDataSource"/> </property> </bean>
client serviceFacadeProxy ”serviceFacade” txInterceptor serviceFacadeTarget txManager productDAO sessionFactory dataSource DB Deployment – Spring • Transaksjoner i Spring • AOP • Transaction Interceptor • Proxy for façade • Konfigurasjon per metode <property name="transactionAttributeSource"> <value> bekk.serviceFacade.getFoo=PROPAGATION_REQUIRED,readOnly bekk.serviceFacade.*=PROPAGATION_REQUIRED </value> </property>
Erfaringer • Utvalgte prosjekter • SQL kode • Sjekk generert SQL! • Criteria API HQL • Muligheter for egen SQL • Connection Pooling • Hibernate innebygd – ikke prod. klar! • Bruk container evt. ekstern (C3PO e.l.)
Erfaringer • DB Støtte • Enkelt å skrive egen Dialect • DB2390Dialect Hibernate • Lær O/R modellering • Generelle prinsipper • Generert kode/SQL – lær å finn feil • Lazy loading • Bra (selvfølge?) for ytelse • ObjectNotFoundException v/multiple sesjoner • Applikasjonstransaksjoner • persistent/transient objekt • Optimistisk låsing default • saveOrUpdateCopy() • Sesjonshåndtering • ThreadLocal • Spring
Fremtidsutsikter – Hibernate 3 • net.sf.hibernate org.hibernate • Checked exceptions Runtime exceptions • Filter API • Full Event Driven Design • Statistics API + JMX Mbean • lazy=”true” for properties • Fikset ytelses problem m/one-to-one properties • Støtte lagrede prosedyrer • SchemaUpdate fikset • HQL forbedringer bedre syntakssjekking mm. • +++
Fremtidsutsikter – JDO 2.0 • Tidligere skal støtte JDO 2.0 spec. • Sentrale hendelser • Hibernate JBoss • Gavin King JBoss group + EJB 3.0 spec. team • Stor diskusjon/uenighet JDO/EJB spec. teams • Nå • Ingen interesse i JDO 2.0 • Mer relevant med EJB 3.0
Fremtidsutsikter – EJB 3.0 • Gavin King EJB 3.0 spec. team • Entity beans • POJO • Slutt på CMR • Slutt på home interface • Veldig likt Hibernate • EntityManager Hibernate Session • Lignende Query grensesnitt • EJB QL forbedringer, inspirert av HQL • create() + merge()/saveOrUpdateCopy() • Stor bruk av Metadata
Fremtidsutsikter – EJB 3.0 • Eksempel • POJO • Metadata @Entitypublic class Customer implements Serializable { private Long id; private String name; private Set<PhoneNumber> phones = new HashSet(); public void setId(Long id) { this.id = id; } ... public void addPhoneNumber(PhoneNumber number) { this.phones.add(number); number.setCustomer(this); // ? INGEN CMR! } }
Fremtidsutsikter – EJB 3.0 • EntityManager vs. Hibernate m/Spring /** * @spring.bean id=“orderEntryDAO" * @spring.property name="sessionFactory" ref="sessionFactory“ */ public class OrderEntryDAO extends HibernateDAOSupport { public void enterOrder(Long custId, Order newOrder) { Customer cust = (Customer)getHibernateTemplate().load(Customer.class, custId); cust.getOrders().add(newOrder); newOrder.setCustomer(cust); } } @Statelesspublic class OrderEntryBean { EntityManager em; @Injectpublic void setEntityManager(EntityManager em) { this.em = em; } public void enterOrder(Long custId, Order newOrder) { Customer cust = (Customer)em.find(”Customer”, custId); cust.getOrders().add(newOrder); newOrder.setCustomer(cust); } }
Fremtidsutsikter – Videre... • J2SE 5.0 • Metadata erstatter XDoclet o.l. • Generics – angi type i relasjoner • Enumerated Types • EJB 3.0 – Hibernate implementasjon? • Støtte for @Entity etc. • Kjøre EJB’er uten container? • NHibernate – http://nhibernate.sourceforge.net
Konklusjon • Hibernate suksess! • Domenemodellen er tilbake! • Sterk driver bak EJB 3.0 • God verktøystøtte • Skriv Javakode! • J2EE eller alene • Spring • JBoss støtte
Q & A Takk for meg! Spørsmål? Ta gjerne kontakt: eivind.waaler@bekk.no Eller besøk BEKK stand for demoer/spørsmål
Demonstrasjon – XDoclet/SchemaExport • Skisse/eksempel – <alt-tab> • Vise Java klasse fil (IDEA) • ‘maven xdoclet:hibernatedoclet’ – vise XML mapping (IDEA) • ‘maven schemaexport’ – vise Database (MySQL CC) Demonstrasjon