You can subscribe to this list here.
2002 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(22) |
Nov
(308) |
Dec
(131) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2003 |
Jan
(369) |
Feb
(171) |
Mar
(236) |
Apr
(187) |
May
(218) |
Jun
(217) |
Jul
(127) |
Aug
(448) |
Sep
(270) |
Oct
(231) |
Nov
(422) |
Dec
(255) |
2004 |
Jan
(111) |
Feb
(73) |
Mar
(338) |
Apr
(351) |
May
(349) |
Jun
(495) |
Jul
(394) |
Aug
(1048) |
Sep
(499) |
Oct
(142) |
Nov
(269) |
Dec
(638) |
2005 |
Jan
(825) |
Feb
(1272) |
Mar
(593) |
Apr
(690) |
May
(950) |
Jun
(958) |
Jul
(767) |
Aug
(839) |
Sep
(525) |
Oct
(449) |
Nov
(585) |
Dec
(455) |
2006 |
Jan
(603) |
Feb
(656) |
Mar
(195) |
Apr
(114) |
May
(136) |
Jun
(100) |
Jul
(128) |
Aug
(68) |
Sep
(7) |
Oct
(1) |
Nov
(1) |
Dec
(8) |
2007 |
Jan
(4) |
Feb
(3) |
Mar
(8) |
Apr
(16) |
May
(5) |
Jun
(4) |
Jul
(6) |
Aug
(23) |
Sep
(15) |
Oct
(5) |
Nov
(7) |
Dec
(5) |
2008 |
Jan
(5) |
Feb
(1) |
Mar
(1) |
Apr
(5) |
May
(1) |
Jun
(1) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
(1) |
Dec
|
2009 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(1) |
Aug
|
Sep
|
Oct
|
Nov
(1) |
Dec
|
2011 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(1) |
2012 |
Jan
|
Feb
|
Mar
|
Apr
(1) |
May
|
Jun
(1) |
Jul
(1) |
Aug
(1) |
Sep
|
Oct
(2) |
Nov
(3) |
Dec
(2) |
2013 |
Jan
(1) |
Feb
|
Mar
(2) |
Apr
(1) |
May
|
Jun
|
Jul
(1) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2014 |
Jan
|
Feb
|
Mar
(1) |
Apr
|
May
(2) |
Jun
(1) |
Jul
|
Aug
(1) |
Sep
(1) |
Oct
|
Nov
(1) |
Dec
|
2015 |
Jan
|
Feb
|
Mar
|
Apr
(1) |
May
|
Jun
|
Jul
|
Aug
|
Sep
(1) |
Oct
|
Nov
|
Dec
|
2016 |
Jan
|
Feb
|
Mar
(1) |
Apr
|
May
(1) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2017 |
Jan
(1) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(1) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: <hib...@li...> - 2006-08-02 00:42:29
|
Author: epbernard Date: 2006-08-01 20:42:25 -0400 (Tue, 01 Aug 2006) New Revision: 10187 Added: trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/xml/Article.java Modified: trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/transaction/Book.java trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/transaction/FlushAndTransactionTest.java trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/xml/XmlTest.java trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/xml/orm.xml trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/xml/XMLContext.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/bytecode/ProxyBreakingTest.java trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXClassTest.java Log: ANN-405 partial XML overriden @ManyToOne have unecessary @JoinTable if a default schema is set up EJB-203 xml overriden access type PROPERTY and FIELD were not lower cased leading to CNFE Modified: trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/transaction/Book.java =================================================================== --- trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/transaction/Book.java 2006-08-01 23:27:28 UTC (rev 10186) +++ trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/transaction/Book.java 2006-08-02 00:42:25 UTC (rev 10187) @@ -5,6 +5,7 @@ import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; +import javax.persistence.Version; /** * @author Emmanuel Bernard @@ -16,6 +17,9 @@ public Integer id; public String name; + @Version + public Integer version; + public Integer getId() { return id; } @@ -31,4 +35,12 @@ public void setName(String name) { this.name = name; } + + public Integer getVersion() { + return version; + } + + public void setVersion(Integer version) { + this.version = version; + } } Modified: trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/transaction/FlushAndTransactionTest.java =================================================================== --- trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/transaction/FlushAndTransactionTest.java 2006-08-01 23:27:28 UTC (rev 10186) +++ trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/transaction/FlushAndTransactionTest.java 2006-08-02 00:42:25 UTC (rev 10187) @@ -2,10 +2,10 @@ package org.hibernate.ejb.test.transaction; import javax.persistence.EntityManager; -import javax.persistence.EntityNotFoundException; import javax.persistence.LockModeType; import javax.persistence.RollbackException; import javax.persistence.TransactionRequiredException; +import javax.persistence.PersistenceException; import org.hibernate.ejb.HibernateEntityManagerFactory; import org.hibernate.ejb.test.TestCase; @@ -185,14 +185,23 @@ public void testRollbackOnlyOnPersistenceException() throws Exception { Book book = new Book(); book.name = "Stolen keys"; - book.id = new Integer( 50 ); + book.id = null; //new Integer( 50 ); EntityManager em = factory.createEntityManager(); em.getTransaction().begin(); try { - em.refresh( book ); - fail( "Get reference on wrong entity should fail" ); + em.persist( book ); + em.flush(); + em.clear(); + book.setName( "kitty kid"); + em.merge( book ); + em.flush(); + em.clear(); + book.setName( "kitty kid2"); //non updated version + em.merge( book ); + em.flush(); + fail( "optimistic locking exception" ); } - catch (EntityNotFoundException e) { + catch (PersistenceException e) { //success } try { Added: trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/xml/Article.java =================================================================== --- trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/xml/Article.java 2006-08-01 23:27:28 UTC (rev 10186) +++ trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/xml/Article.java 2006-08-02 00:42:25 UTC (rev 10187) @@ -0,0 +1,49 @@ +//$Id: $ +package org.hibernate.ejb.test.xml; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.GeneratedValue; +import javax.persistence.CascadeType; +import javax.persistence.ManyToOne; +import javax.persistence.JoinColumn; + +/** + * @author Emmanuel Bernard + */ +@Entity +@Table(name = "ITEM") +...@or...tchSize(size = 10) +public class Article { + private Integer id; + private String name; + + private Article nextArticle; + + @Id @GeneratedValue public Integer getId() { + return id; + } + public void setId(Integer id) { + this.id = id; + } + @Column(name="poopoo") + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + + + @ManyToOne(cascade = CascadeType.ALL) + @JoinColumn(name = "NEXT_MESSAGE_ID") + public Article getNextArticle() { + return nextArticle; + } + + public void setNextArticle(Article nextArticle) { + this.nextArticle = nextArticle; + } +} Modified: trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/xml/XmlTest.java =================================================================== --- trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/xml/XmlTest.java 2006-08-01 23:27:28 UTC (rev 10186) +++ trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/xml/XmlTest.java 2006-08-02 00:42:25 UTC (rev 10187) @@ -1,30 +1,28 @@ //$Id: $ package org.hibernate.ejb.test.xml; -import javax.persistence.EntityManagerFactory; +import javax.persistence.EntityManager; -import junit.framework.TestCase; -import org.hibernate.ejb.HibernatePersistence; -import org.hibernate.ejb.test.connection.FakeDataSourceException; -import org.hibernate.ejb.test.connection.PersistenceUnitInfoImpl; +import org.hibernate.ejb.test.TestCase; /** * @author Emmanuel Bernard */ public class XmlTest extends TestCase { - public void testPersistenceInfo() throws Exception { - PersistenceUnitInfoImpl info = new PersistenceUnitInfoImpl( - new String[]{ - "org/hibernate/ejb/test/xml/orm.xml", - "org/hibernate/ejb/test/xml/orm2.xml" - } - ); - try { - EntityManagerFactory emf = ( new HibernatePersistence() ).createContainerEntityManagerFactory( info, null ); - fail( "FakeDatasource should have been used" ); - } - catch (FakeDataSourceException fde) { - //success - } + public void testXmlMappingCorrectness() throws Exception { + EntityManager em = factory.createEntityManager(); + em.close(); } + + public Class[] getAnnotatedClasses() { + return new Class[0]; + } + + @Override + public String[] getEjb3DD() { + return new String[] { + "org/hibernate/ejb/test/xml/orm.xml", + "org/hibernate/ejb/test/xml/orm2.xml" + }; + } } Modified: trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/xml/orm.xml =================================================================== --- trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/xml/orm.xml 2006-08-01 23:27:28 UTC (rev 10186) +++ trunk/HibernateExt/ejb/src/test/org/hibernate/ejb/test/xml/orm.xml 2006-08-02 00:42:25 UTC (rev 10187) @@ -5,6 +5,14 @@ xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_1_0.xsd" version="1.0" > + <persistence-unit-metadata> + <persistence-unit-defaults> + <schema>MY_SCHEMA</schema> + <catalog>MY_CATALOG</catalog> + <access>PROPERTY</access> + <cascade-persist/> + </persistence-unit-defaults> + </persistence-unit-metadata> <package>org.hibernate.ejb.test.xml</package> <entity class="Light" metadata-complete="true" access="FIELD"> <attributes> @@ -14,4 +22,12 @@ <basic name="power"></basic> </attributes> </entity> + <entity class="Article" + metadata-complete="false"> + <attributes> + <id name="id"> + <generated-value strategy="SEQUENCE"/> + </id> + </attributes> + </entity> </entity-mappings> \ No newline at end of file Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java 2006-08-01 23:27:28 UTC (rev 10186) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java 2006-08-02 00:42:25 UTC (rev 10187) @@ -453,11 +453,19 @@ } } - private JoinTable overridesDefaultsInJoinTable(XMLContext.Default defaults) { + private JoinTable overridesDefaultsInJoinTable(Annotation annotation, XMLContext.Default defaults) { //no element but might have some default or some annotation + boolean defaultToJoinTable = ! ( super.isAnnotationPresent( JoinColumn.class ) + || super.isAnnotationPresent( JoinColumns.class ) ); + defaultToJoinTable = defaultToJoinTable && + ( ( annotation.annotationType() == ManyToMany.class && StringHelper.isEmpty( ( (ManyToMany) annotation).mappedBy() ) ) + || ( annotation.annotationType() == OneToMany.class && StringHelper.isEmpty( ( (OneToMany) annotation).mappedBy() ) ) + || ( annotation.annotationType() == CollectionOfElements.class ) + ); final Class<JoinTable> annotationType = JoinTable.class; - if ( StringHelper.isNotEmpty( defaults.getCatalog() ) - || StringHelper.isNotEmpty( defaults.getSchema() ) ) { + if ( defaultToJoinTable + && ( StringHelper.isNotEmpty( defaults.getCatalog() ) + || StringHelper.isNotEmpty( defaults.getSchema() ) ) ) { AnnotationDescriptor ad = new AnnotationDescriptor( annotationType ); if ( defaults.canUseJavaAnnotations() ) { JoinTable table = super.getAnnotation( annotationType ); @@ -555,7 +563,7 @@ Annotation annotation = super.getAnnotation( annotationType ); if ( annotation != null ) { annotationList.add( annotation ); - annotation = overridesDefaultsInJoinTable( defaults ); + annotation = overridesDefaultsInJoinTable( annotation, defaults ); if ( annotation != null ) annotationList.add( annotation ); annotation = super.getAnnotation( JoinColumn.class ); if ( annotation != null ) annotationList.add( annotation ); @@ -589,7 +597,7 @@ if ( annotation != null ) annotationList.add( annotation ); } else if ( super.isAnnotationPresent( CollectionOfElements.class ) ) { - annotation = overridesDefaultsInJoinTable( defaults ); + annotation = overridesDefaultsInJoinTable( super.getAnnotation( CollectionOfElements.class ), defaults ); if ( annotation != null ) annotationList.add( annotation ); annotation = super.getAnnotation( JoinColumn.class ); if ( annotation != null ) annotationList.add( annotation ); @@ -958,8 +966,8 @@ private boolean isProcessingId(XMLContext.Default defaults) { boolean isExplicit = defaults.getAccess() != null; boolean correctAccess = - ( PropertyType.PROPERTY.equals( propertyType ) && "property".equalsIgnoreCase( defaults.getAccess() ) ) - || ( PropertyType.FIELD.equals( propertyType ) && "field".equalsIgnoreCase( defaults.getAccess() ) ); + ( PropertyType.PROPERTY.equals( propertyType ) && "property".equals( defaults.getAccess() ) ) + || ( PropertyType.FIELD.equals( propertyType ) && "field".equals( defaults.getAccess() ) ); boolean hasId = defaults.canUseJavaAnnotations() && ( super.isAnnotationPresent( Id.class ) || super.isAnnotationPresent( EmbeddedId.class ) ); //if ( properAccessOnMetadataComplete || properOverridingOnMetadataNonComplete ) { @@ -979,9 +987,9 @@ private boolean computeProperAccessOnMetadataComplete(XMLContext.Default defaults) { return ( ! defaults.canUseJavaAnnotations() ) - && ( ( ! "field".equalsIgnoreCase( defaults.getAccess() ) && ! PropertyType.FIELD + && ( ( ! "field".equals( defaults.getAccess() ) && ! PropertyType.FIELD .equals( propertyType ) ) - || ( "field".equalsIgnoreCase( defaults.getAccess() ) && PropertyType.FIELD.equals( propertyType ) ) ); + || ( "field".equals( defaults.getAccess() ) && PropertyType.FIELD.equals( propertyType ) ) ); } private Columns buildColumns(Element element) { @@ -1198,22 +1206,24 @@ private AccessType getAccessType(Element tree, XMLContext.Default defaults) { String access = tree == null ? null : tree.attributeValue( "access" ); - if ( "FIELD".equals( access ) || "PROPERTY".equals( access ) ) access = access.toLowerCase(); + if ( "FIELD".equals( access ) || "PROPERTY".equals( access ) ) { + access = access.toLowerCase(); + } if ( access != null ) { AnnotationDescriptor ad = new AnnotationDescriptor( AccessType.class ); ad.setValue( "value", access ); - isFieldAccess = "field".equalsIgnoreCase( access ); + isFieldAccess = "field".equals( access ); return AnnotationFactory.create( ad ); } else if ( defaults.canUseJavaAnnotations() && super.isAnnotationPresent( AccessType.class ) ) { AccessType annotation = super.getAnnotation( AccessType.class ); - isFieldAccess = "field".equalsIgnoreCase( annotation != null ? annotation.value() : null ); + isFieldAccess = "field".equals( annotation != null ? annotation.value() : null ); return annotation; } else if ( defaults.getAccess() != null ) { AnnotationDescriptor ad = new AnnotationDescriptor( AccessType.class ); ad.setValue( "value", defaults.getAccess() ); - isFieldAccess = "field".equalsIgnoreCase( defaults.getAccess() ); + isFieldAccess = "field".equals( defaults.getAccess() ); return AnnotationFactory.create( ad ); } else { Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/xml/XMLContext.java =================================================================== --- trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/xml/XMLContext.java 2006-08-01 23:27:28 UTC (rev 10186) +++ trunk/HibernateExt/metadata/src/java/org/hibernate/reflection/java/xml/XMLContext.java 2006-08-02 00:42:25 UTC (rev 10187) @@ -176,7 +176,12 @@ } protected void setAccess(String access) { - this.access = access; + if ( "FIELD".equals( access ) || "PROPERTY".equals( access ) ) { + this.access = access.toLowerCase(); + } + else { + this.access = access; + } } public String getCatalog() { Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/bytecode/ProxyBreakingTest.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/bytecode/ProxyBreakingTest.java 2006-08-01 23:27:28 UTC (rev 10186) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/bytecode/ProxyBreakingTest.java 2006-08-02 00:42:25 UTC (rev 10187) @@ -4,8 +4,8 @@ import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.Hibernate; +import org.hibernate.test.annotations.TestCase; import org.hibernate.cfg.Configuration; -import org.hibernate.test.TestCase; /** * @author Emmanuel Bernard @@ -18,7 +18,7 @@ public void testProxiedBridgeMethod() throws Exception { //bridge methods should not be proxied - Session s = openSession( ); + Session s = openSession(); Transaction tx = s.beginTransaction(); Hammer h = new Hammer(); s.save(h); @@ -35,7 +35,11 @@ super( name ); } - protected String[] getMappings() { + protected Class[] getMappings() { + return new Class[0]; + } + + protected String[] getXmlFiles() { return new String[] { "annotations/bytecode/Hammer.hbm.xml" }; Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXClassTest.java =================================================================== --- trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXClassTest.java 2006-08-01 23:27:28 UTC (rev 10186) +++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/reflection/java/JavaXClassTest.java 2006-08-02 00:42:25 UTC (rev 10187) @@ -41,6 +41,11 @@ assertEquals( grandpa, fatherAsSeenFromSon.getSuperclass() ); } + public void testSuperSuperClass() { + assertEquals( factory.toXClass( Object.class ), grandpa.getSuperclass() ); + assertEquals( null, grandpa.getSuperclass().getSuperclass() ); + } + public void testHasInterfaces() { XClass[] interfaces = fatherAsSeenFromSon.getSuperclass().getInterfaces(); assertEquals( 2, interfaces.length ); |
From: <hib...@li...> - 2006-08-01 23:27:30
|
Author: epbernard Date: 2006-08-01 19:27:28 -0400 (Tue, 01 Aug 2006) New Revision: 10186 Modified: branches/Branch_3_2/Hibernate3/src/org/hibernate/event/def/DefaultMergeEventListener.java Log: HHH-1927 bug introduced after bug fix. version1 same as version2 is considered a stale object Modified: branches/Branch_3_2/Hibernate3/src/org/hibernate/event/def/DefaultMergeEventListener.java =================================================================== --- branches/Branch_3_2/Hibernate3/src/org/hibernate/event/def/DefaultMergeEventListener.java 2006-08-01 23:22:23 UTC (rev 10185) +++ branches/Branch_3_2/Hibernate3/src/org/hibernate/event/def/DefaultMergeEventListener.java 2006-08-01 23:27:28 UTC (rev 10186) @@ -297,7 +297,7 @@ // an entity to be merged during the same transaction // (though during a seperate operation) in which it was // originally persisted/saved - boolean changed = persister.getVersionType().isSame( + boolean changed = ! persister.getVersionType().isSame( persister.getVersion( target, source.getEntityMode() ), persister.getVersion( entity, source.getEntityMode() ), source.getEntityMode() |
From: <hib...@li...> - 2006-08-01 23:22:27
|
Author: epbernard Date: 2006-08-01 19:22:23 -0400 (Tue, 01 Aug 2006) New Revision: 10185 Modified: trunk/Hibernate3/src/org/hibernate/event/def/DefaultMergeEventListener.java Log: HHH-1958 bug introduced after bug fix. version1 same as version2 is considered a stale object Modified: trunk/Hibernate3/src/org/hibernate/event/def/DefaultMergeEventListener.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/event/def/DefaultMergeEventListener.java 2006-08-01 09:30:14 UTC (rev 10184) +++ trunk/Hibernate3/src/org/hibernate/event/def/DefaultMergeEventListener.java 2006-08-01 23:22:23 UTC (rev 10185) @@ -299,7 +299,7 @@ // an entity to be merged during the same transaction // (though during a seperate operation) in which it was // originally persisted/saved - boolean changed = persister.getVersionType().isSame( + boolean changed = ! persister.getVersionType().isSame( persister.getVersion( target, source.getEntityMode() ), persister.getVersion( entity, source.getEntityMode() ), source.getEntityMode() |
From: <hib...@li...> - 2006-08-01 09:30:19
|
Author: honma Date: 2006-08-01 05:30:14 -0400 (Tue, 01 Aug 2006) New Revision: 10184 Modified: trunk/Hibernate3/doc/reference/ja/readme_ja.txt Log: Modified: trunk/Hibernate3/doc/reference/ja/readme_ja.txt =================================================================== --- trunk/Hibernate3/doc/reference/ja/readme_ja.txt 2006-08-01 09:29:01 UTC (rev 10183) +++ trunk/Hibernate3/doc/reference/ja/readme_ja.txt 2006-08-01 09:30:14 UTC (rev 10184) @@ -1 +1 @@ -This translated reference document is v3.1.2. \ No newline at end of file +This translated reference document is v3.2.0 \ No newline at end of file |
From: <hib...@li...> - 2006-08-01 09:29:11
|
Author: honma Date: 2006-08-01 05:29:01 -0400 (Tue, 01 Aug 2006) New Revision: 10183 Modified: trunk/Hibernate3/doc/reference/ja/modules/architecture.xml trunk/Hibernate3/doc/reference/ja/modules/basic_mapping.xml trunk/Hibernate3/doc/reference/ja/modules/configuration.xml trunk/Hibernate3/doc/reference/ja/modules/performance.xml trunk/Hibernate3/doc/reference/ja/modules/persistent_classes.xml trunk/Hibernate3/doc/reference/ja/modules/query_sql.xml trunk/Hibernate3/doc/reference/ja/modules/session_api.xml trunk/Hibernate3/doc/reference/ja/modules/tutorial.xml Log: for v3.2.0. Modified: trunk/Hibernate3/doc/reference/ja/modules/architecture.xml =================================================================== --- trunk/Hibernate3/doc/reference/ja/modules/architecture.xml 2006-07-31 20:27:50 UTC (rev 10182) +++ trunk/Hibernate3/doc/reference/ja/modules/architecture.xml 2006-08-01 09:29:01 UTC (rev 10183) @@ -7,6 +7,9 @@ <title>T/title> <para> + A (very) high-level view of the Hibernate architecture: + </para> + <para> HibernateA[LeN`́iɁjxr[F </para> @@ -20,12 +23,23 @@ </mediaobject> <para> + This diagram shows Hibernate using the database and configuration data to + provide persistence services (and persistent objects) to the application. + </para> + <para> ̐}ibernateAAvP[VɑĉiT[rX iƉiIuWFNgj邽߂ɁAf[^x[XƐݒ[^Ƃ Ă܂B </para> <para> + We would like to show a more detailed view of the runtime architecture. + Unfortunately, Hibernate is flexible and supports several approaches. We will + show the two extremes. The "lite" architecture has the application + provide its own JDBC connections and manage its own transactions. This approach + uses a minimal subset of Hibernate's APIs: + </para> + <para> ŎsA[LeN`̂ڍׂȃr[܂傤B ɂAHibernate͏_낢Av[`|[gĂ܂B ł́A2̋ɒ[ȗ܂B @@ -44,6 +58,10 @@ </mediaobject> <para> + The "full cream" architecture abstracts the application away from the + underlying JDBC/JTA APIs and lets Hibernate take care of the details. + </para> + <para> udvA[LeN`́AAvP[V̉ɈʒuBCAPI ĒۉȀڍׂ̖ʓ|ernateɌ܂B </para> @@ -65,6 +83,13 @@ <term>SessionFactory (<literal>org.hibernate.SessionFactory</literal>)</term> <listitem> <para> + A threadsafe (immutable) cache of compiled mappings for a single database. + A factory for <literal>Session</literal> and a client of + <literal>ConnectionProvider</literal>. Might hold an optional (second-level) + cache of data that is reusable between transactions, at a + process- or cluster-level. + </para> + <para> 1̃f[^x[XɑpCꂽ}bsO XbhZ[tȁiXVs\́jLbVB <literal>Session</literal> ̃t@Ngł @@ -78,8 +103,15 @@ <term>Session (<literal>org.hibernate.Session</literal>)</term> <listitem> <para> + A single-threaded, short-lived object representing a conversation between + the application and the persistent store. Wraps a JDBC connection. Factory + for <literal>Transaction</literal>. Holds a mandatory (first-level) cache + of persistent objects, used when navigating the object graph or looking up + objects by identifier. + </para> + <para> AvP[VƉiXgAƂ̑ΘbA - VOEXbhŒZ̃IuWFNgB + VOXbhŒZ̃IuWFNgB JDBCRlNVbv܂B <literal>Transaction</literal> ̃t@NgłB iIuWFNg̕K{́iꎟjLbV܂B @@ -92,6 +124,14 @@ <term>Persistent objects Collections</term> <listitem> <para> + Short-lived, single threaded objects containing persistent state and business + function. These might be ordinary JavaBeans/POJOs, the only special thing about + them is that they are currently associated with (exactly one) + <literal>Session</literal>. As soon as the <literal>Session</literal> is closed, + they will be detached and free to use in any application layer (e.g. directly + as data transfer objects to and from presentation). + </para> + <para> iƃrWlX\bhAZŃVOXbh̃IuWFNgB ʏJavaBeans/POJÔƂAIȂƂ́A ̎_ł́i1́j <literal>Session</literal> Ɗ֘AĂ邱ƂłB @@ -106,6 +146,12 @@ <term>Transient detached objects Collections</term> <listitem> <para> + Instances of persistent classes that are not currently associated with a + <literal>Session</literal>. They may have been instantiated by + the application and not (yet) persisted or they may have been instantiated by a + closed <literal>Session</literal>. + </para> + <para> _ł<literal>Session</literal> Ɗ֘AĂȂA iNX̃CX^XB łɃAvP[VŃCX^XāA܂iȂA @@ -117,8 +163,16 @@ <term>Transaction (<literal>org.hibernate.Transaction</literal>)</term> <listitem> <para> + (Optional) A single-threaded, short-lived object used by the application to + specify atomic units of work. Abstracts application from underlying JDBC, + JTA or CORBA transaction. A <literal>Session</literal> might span several + <literal>Transaction</literal>s in some cases. However, transaction demarcation, + either using the underlying API or <literal>Transaction</literal>, is never + optional! + </para> + <para> (IvV)qPUnit of Work)肷邽߂ɁAAvP[Vgp - VOEXbhŒZȃIuWFNgB + VOXbhŒZȃIuWFNgB ɈʒuBCAJTAACORBAgUNVvP[V𒊏ۉ܂B <literal>Session</literal> ́Aɂ <literal>Transaction</literal> 邩@@ -131,6 +185,11 @@ <term>ConnectionProvider (<literal>org.hibernate.connection.ConnectionProvider</literal>)</term> <listitem> <para> + (Optional) A factory for (and pool of) JDBC connections. Abstracts application from + underlying <literal>Datasource</literal> or <literal>DriverManager</literal>. + Not exposed to application, but can be extended/implemented by the developer. + </para> + <para> (IvV)JDBCRlNViƂ̃v[j̃t@NgB ̑wɈʒuliteral>Datasource</literal> <literal>DriverManager</literal> vP[V𒊏ۉ܂B @@ -142,6 +201,10 @@ <term>TransactionFactory (<literal>org.hibernate.TransactionFactory</literal>)</term> <listitem> <para> + (Optional) A factory for <literal>Transaction</literal> instances. Not exposed to the + application, but can be extended/implemented by the developer. + </para> + <para> (IvV) <literal>Transaction</literal> CX^X̃t@NgB AvP[Vɂ͌AJ҂p܂͎邱Ƃ͉\łB </para> @@ -151,6 +214,10 @@ <term><emphasis>Extension Interfaces</emphasis></term> <listitem> <para> + Hibernate offers many optional extension interfaces you can implement to customize + the behavior of your persistence layer. See the API documentation for details. + </para> + <para> HibernatéAiw̐U镑X^}CY邽߂ɁA ̃IvVgC^tF[XӂĂ܂B ڍׂPIhLgƂĂB @@ -161,6 +228,11 @@ </para> <para> + Given a "lite" architecture, the application bypasses the + <literal>Transaction</literal>/<literal>TransactionFactory</literal> and/or + <literal>ConnectionProvider</literal> APIs to talk to JTA or JDBC directly. + </para> + <para> uyvA[LeN`ł́AAvP[V͒TABCƑΘb邽߂ɁA <literal>Transaction</literal> literal>TransactionFactory</literal> <literal>ConnectionProvider</literal> CpX܂B @@ -170,6 +242,11 @@ <sect1 id="architecture-states" revision="1"> <title>CX^X̏/title> <para> + An instance of a persistent classes may be in one of three different states, + which are defined with respect to a <emphasis>persistence context</emphasis>. + The Hibernate <literal>Session</literal> object is the persistence context: + </para> + <para> iNX̃CX^X́ÂR̈قȂԂ̂ǂꂩɂȂB A <emphasis>iReLXg</emphasis> ɂČ܂B Hibernate<literal>Session</literal> IuWFNgAiReLXgɂȂB @@ -180,6 +257,11 @@ <term>transient</term> <listitem> <para> + The instance is not, and has never been associated with + any persistence context. It has no persistent identity + (primary key value). + </para> + <para> ̏̃CX^X́A݂ĉߋɂĂ iReLXgɊ֘AÂĂ܂܂AiIDi[̒lj Ă܂@@ -190,6 +272,15 @@ <term>persistent</term> <listitem> <para> + The instance is currently associated with a persistence + context. It has a persistent identity (primary key value) + and, perhaps, a corresponding row in the database. For a + particular persistence context, Hibernate + <emphasis>guarantees</emphasis> that persistent identity + is equivalent to Java identity (in-memory location of the + object). + </para> + <para> ̏̃CX^X́A̎_ʼniReLXgɊ֘AÂĂ܂B ܂AiIDi[̒ljA Ă̓f[^x[XɑΉĂ傤B @@ -203,6 +294,15 @@ <term>detached</term> <listitem> <para> + The instance was once associated with a persistence + context, but that context was closed, or the instance + was serialized to another process. It has a persistent + identity and, perhaps, a corrsponding row in the database. + For detached instances, Hibernate makes no guarantees + about the relationship between persistent identity and + Java identity. + </para> + <para> ̏̃CX^X́AĉiReLXgɊ֘AÂA ̃ReLXgN[YꂽA邢́A ̃vZXɂ̃CX^XVACYꂽłB @@ -219,6 +319,11 @@ <title>JMXƂ̓</title> <para> + JMX is the J2EE standard for management of Java components. Hibernate may be managed via + a JMX standard service. We provide an MBean implementation in the distribution, + <literal>org.hibernate.jmx.HibernateService</literal>. + </para> + <para> JMXavaR|[lgǗ2EEWłB JMXWT[rXāAHibernate͊ǗB fBXgr[V̒<literal>org.hibernate.jmx.HibernateService</literal> Ƃ @@ -226,6 +331,11 @@ </para> <para> + For an example how to deploy Hibernate as a JMX service on the JBoss Application Server, + please see the JBoss User Guide. On JBoss AS, you also get these benefits if you deploy + using JMX: + </para> + <para> JBoss AvP[VT[o[HibernateT[rXƂăfvC@̗ẮA JBoss [UKChƂĂB JBoss AvP[VT[o[ɂāA JMXăfvCÃbg܂B @@ -234,6 +344,16 @@ <itemizedlist> <listitem> <para> + <emphasis>Session Management:</emphasis> The Hibernate <literal>Session</literal>'s lifecycle + can be automatically bound to the scope of a JTA transaction. This means you no + longer have to manually open and close the <literal>Session</literal>, this + becomes the job of a JBoss EJB interceptor. You also don't have to worry about + transaction demarcation in your code anymore (unless you'd like to write a portable + persistence layer of course, use the optional Hibernate <literal>Transaction</literal> + API for this). You call the <literal>HibernateContext</literal> to access a + <literal>Session</literal>. + </para> + <para> <emphasis>ZbVǗ:</emphasis> Hibernate<literal>Session</literal> ̃CtTCŃA ITAgUNṼXR[vɌт܂BA <literal>Session</literal> [vN[Y肷vȂƂ܂B @@ -247,6 +367,14 @@ </listitem> <listitem> <para> + <emphasis>HAR deployment:</emphasis> Usually you deploy the Hibernate JMX service using a JBoss + service deployment descriptor (in an EAR and/or SAR file), it supports all the usual + configuration options of a Hibernate <literal>SessionFactory</literal>. However, you still + have to name all your mapping files in the deployment descriptor. If you decide to use + the optional HAR deployment, JBoss will automatically detect all mapping files in your + HAR file. + </para> + <para> <emphasis>HAR fvC:</emphasis> ʏ(EAR ܂SAR t@CɂJBoss T[rX fvCgfBXNv^āAHibernate JMX T[rXvC܂B AHibernate<literal>SessionFactory</literal> ̑SĂ̈IȐݒvV -259,11 +387,18 @@ </itemizedlist> <para> + Consult the JBoss AS user guide for more information about these options. + </para> + <para> ̃IvVɂĂ̏ڍׂȏ́AJBossAvP[VT[o[UKCh QlɂĂB </para> <para> + Another feature available as a JMX service are runtime Hibernate statistics. See + <xref linkend="configuration-optional-statistics"/>. + </para> + <para> JMXT[rXƂėp\ȑ̋@\ɁAHibernatesvB <xref linkend="configuration-optional-statistics"/> ĂB </para> @@ -272,24 +407,48 @@ <sect1 id="architecture-jca" revision="1"> <title>JCA T|[g</title> <para> + Hibernate may also be configured as a JCA connector. Please see the website for more + details. Please note that Hibernate JCA support is still considered experimental. + </para> + <para> Hibernate JCA RlN^ƂĂ܂BڍׂɂẮAWebTCgĂB Hibernate JCA T|[ǵÂƂiKƂčlĂ邱ƂɒӂĂB </para> </sect1> - <sect1 id="architecture-current-session" revision="1"> + <sect1 id="architecture-current-session" revision="2"> <title>ReLXgZbV</title> <para> + Most applications using Hibernate need some form of "contextual" sessions, where a given + session is in effect throughout the scope of a given context. However, across applications + the definition of what constitutes a context is typically different; and different contexts + define different scopes to the notion of current. Applications using Hibernate prior + to version 3.0 tended to utilize either home-grown <literal>ThreadLocal</literal>-based + contextual sessions, helper classes such as <literal>HibernateUtil</literal>, or utilized + third-party frameworks (such as Spring or Pico) which provided proxy/interception-based contextual sessions. + </para> + <para> Hibernate AvP[V́AقƂAȂ̌`ReLXg"ZbVKvɂȂB uReLXgZbVv́AReLXg̃XR[v̂ȂŗLbV̂ƂłB - AӂAAvP[VƂɃReLXĝ͈̒قȂB + AʏvP[VƂɃReLXĝ͈̒قȂB قȂ镡̃ReLXǵA_ɑĈقȂR[v`܂B o[W3.0OHibernate ł́A <literal>ThreadLocal</literal> x[X́uReLXgZbVv p邩A <literal>HibernateUtil</literal> ̂悤ȃwp[NX𗘗p邩A proxy/interception x[X́uReLXgZbVv iSpring ico ̂悤ȁjT[hp[eB̃t[[N𗘗p邩̂ǂꂩłB + iSpring ico ̂悤ȁjT[hp[eB̃t[[N𗘗p邩̂ꂩłB </para> + <para> + Starting with version 3.0.1, Hibernate added the <literal>SessionFactory.getCurrentSession()</literal> + method. Initially, this assumed usage of <literal>JTA</literal> transactions, where the + <literal>JTA</literal> transaction defined both the scope and context of a current session. + The Hibernate team maintains that, given the maturity of the numerous stand-alone + <literal>JTA TransactionManager</literal> implementations out there, most (if not all) + applications should be using <literal>JTA</literal> transaction management whether or not + they are deployed into a <literal>J2EE</literal> container. Based on that, the + <literal>JTA</literal>-based contextual sessions is all you should ever need to use. + </para> + <para> o[W 3.0.1 Hibernate ɂ<literal>SessionFactory.getCurrentSession()</literal> ܂B A <literal>JTA</literal> gUNV̎gpĂ܂B <literal>JTA</literal> gUNV́Ã݂ZbṼXR[vƃReLXg̗`܂B @@ -301,15 +460,30 @@ ̍lɊƁA <literal>JTA</literal> x[X́uReLXgZbVv gȂł傤B </para> - + <para> + However, as of version 3.1, the processing behind + <literal>SessionFactory.getCurrentSession()</literal> is now pluggable. To that + end, a new extension interface (<literal>org.hibernate.context.CurrentSessionContext</literal>) + and a new configuration parameter (<literal>hibernate.current_session_context_class</literal>) + have been added to allow pluggability of the scope and context of defining current sessions. + </para> + <para> Ao[W 3.1 A <literal>SessionFactory.getCurrentSession()</literal> ̌A vKuɂȂB āÃ݂ZbV`R[vƃReLXg̃vKreB\ɂ邽߂ɁA VgC^tF[X ( <literal>org.hibernate.context.CurrentSessionContext</literal> ) V\p[^ ( <literal>hibernate.current_session_context_class</literal> ) ljB </para> + <para> + See the Javadocs for the <literal>org.hibernate.context.CurrentSessionContext</literal> + interface for a detailed discussion of its contract. It defines a single method, + <literal>currentSession()</literal>, by which the implementation is responsible for + tracking the current contextual session. Out-of-the-box, Hibernate comes with three + implementations of this interface. + </para> + <para> <literal>org.hibernate.context.CurrentSessionContext</literal> C^tF[X̋KĂ ڍׂȓJavadoc ƂĂB ́A <literal>currentSession()</literal> Ƃ1̃\bh @@ -320,43 +494,91 @@ <itemizedlist> <listitem> <para> + <literal>org.hibernate.context.JTASessionContext</literal> - current sessions + are tracked and scoped by a <literal>JTA</literal> transaction. The processing + here is exactly the same as in the older JTA-only approach. See the Javadocs + for details. + </para> + <para> <literal>org.hibernate.context.JTASessionContext</literal> - <literal>JTA</literal> gUNVɂāÃ݂ZbVǐՂ - XR[v߂܂B̏́A JTÃAv[`Ƃ܂łB - ڍׂ́AJavadoc ƂĂB + XR[v߂܂B̏́AÂJTÃAv[`Ƃ܂łB + ڍׂavadocƂĂB </para> </listitem> <listitem> <para> + <literal>org.hibernate.context.ThreadLocalSessionContext</literal> - current + sessions are tracked by thread of execution. Again, see the Javadocs for details. + </para> + <para> <literal>org.hibernate.context.ThreadLocalSessionContext</literal> - Xbh̎sɂāÃ݂ZbVǐՂB - ڍׂ́AJavadoc ƂĂB + ڍׂavadocƂĂB </para> </listitem> + <listitem> + <para> + <literal>org.hibernate.context.ManagedSessionContext</literal> - current + sessions are tracked by thread of execution. However, you are responsible to + bind and unbind a <literal>Session</literal> instance with static methods + on this class, it does never open, flush, or close a <literal>Session</literal>. + </para> + <para> + <literal>org.hibernate.context.ManagedSessionContext</literal> - + Xbh̎sɂāÃ݂ZbVǐՂB + ÃNXtatic\bh<literal>Session</literal> CX^X oCh/AoChC͂ȂɂB + <literal>Session</literal> [vAtbVAN[Y܂+ </para> + </listitem> </itemizedlist> <para> - ̎́A"1ZbV - 1f[^x[XgUNV" vO~Of܂B - ܂A <emphasis>NGXgƂ̃ZbV</emphasis> ƂĒmĂgĂ܂B + The first two implementations provide a "one session - one database transaction" programming + model, also known and used as <emphasis>session-per-request</emphasis>. The beginning + and end of a Hibernate session is defined by the duration of a database transaction. + If you use programatic transaction demarcation in plain JSE without JTA, you are adviced to + use the Hibernate <literal>Transaction</literal> API to hide the underlying transaction system + from your code. If you use JTA, use the JTA interfaces to demarcate transactions. If you + execute in an EJB container that supports CMT, transaction boundaries are defined declaratively + and you don't need any transaction or session demarcation operations in your code. + Refer to <xref linkend="transactions"/> for more information and code examples. + </para> + <para> + n߂̎́A"1ZbV - 1f[^x[XgUNV" vO~Of܂B + <emphasis>NGXgƂ̃ZbVisession-per-requestj</emphasis> ƂĂĂgĂ܂B Hibernate ZbV̊JnƏÍAf[^x[XgUNV̊܂B - AvOɂgUNVEݒJ2SE TA/UserTransaction/BMT pj - ȂʂɂUNVVXe邽߂ɁA - Hibernate <literal>Transaction</literal> łB - ACMT |[gJB Rei[œ삳ȂAgUNVÉA - 錾IɒłAgUNVbV̋Eݒւ̂悤ȑKvƂȂ- ڍׂȏ[h̗A <xref linkend="transactions"/> ƂĂB + JTAʂSEŁAvOgUNVEݒsȂ + R[hb̃gUNVVXe邽߂ɁA + Hibernate <literal>Transaction</literal> APIƂ悢ł傤B + JTAȂgUNV̋Eݒ́AJTAC^[tFCXĂB + CMT|[gBReiŎsȂgUNVE͐錾Iɒł邽߁A + R[hgUNVbV̋E肷v͂+ ڍׂȏ[h̗A <xref linkend="transactions"/> ƂĂB </para> <para> - <literal>hibernate.current_session_context_class</literal> \p[^́A + The <literal>hibernate.current_session_context_class</literal> configuration parameter + defines which <literal>org.hibernate.context.CurrentSessionContext</literal> implementation + should be used. Note that for backwards compatibility, if this config param is not set + but a <literal>org.hibernate.transaction.TransactionManagerLookup</literal> is configured, + Hibernate will use the <literal>org.hibernate.context.JTASessionContext</literal>. + Typically, the value of this parameter would just name the implementation class to + use; for the three out-of-the-box implementations, however, there are two corresponding + short names, "jta", "thread", and "managed". + </para> + <para> + <literal>hibernate.current_session_context_class</literal> ݒ[^́A <literal>org.hibernate.context.CurrentSessionContext</literal> ̂ǂ̎肵܂B - ʌ݊̂߁A̍\p[^ݒ肳ꂸ- <literal>org.hibernate.transaction.TransactionManagerLookup</literal> ݒ肳ꍇ́A - <literal>org.hibernate.context.JTASessionContext</literal> ܂B - ʏ̃p[^̒lɂ́A2̂ɎĝAgp̎NX̖O肵܂A - "jta" "thread" Ƃꂼȗӂ܂B + ʌ݊̂߁Ãp[^ݒ肳ꂸ + <literal>org.hibernate.transaction.TransactionManagerLookup</literal> ݒ肳ꍇA + Hibernate<literal>org.hibernate.context.JTASessionContext</literal> ƂɒӂĂB + ʏ킱̃p[^̒lɂ́A3̎̒pNX̖Oڎw肵܂B + A"jta", "thread", "managed"Ƃꂼȗӂ܂B </para> </sect1> </chapter> + Modified: trunk/Hibernate3/doc/reference/ja/modules/basic_mapping.xml =================================================================== --- trunk/Hibernate3/doc/reference/ja/modules/basic_mapping.xml 2006-07-31 20:27:50 UTC (rev 10182) +++ trunk/Hibernate3/doc/reference/ja/modules/basic_mapping.xml 2006-08-01 09:29:01 UTC (rev 10183) @@ -97,7 +97,7 @@ - <sect2 id="mapping-declaration-doctype" revision="2"> + <sect2 id="mapping-declaration-doctype" revision="3"> <title>Doctype</title> <para> @@ -108,6 +108,135 @@ C^[lbgɂDt@CƂȂ NXpX̓āADTD錾FĂB </para> + + + + <sect3 id="mapping-declaration-entity-resolution"> + <title> + EntityResolver + + GeBeBE]o + </title> + <para> + + + As mentioned previously, Hibernate will first attempt to resolve DTDs in its classpath. The + manner in which it does this is by registering a custom <literal>org.xml.sax.EntityResolver</literal> + implementation with the SAXReader it uses to read in the xml files. This custom + <literal>EntityResolver</literal> recognizes two different systemId namespaces. + + + + + + + + Oq悤ɁAHibernate͂܂̃NXpXDTD悤Ƃ܂B + DTD̉́A + JX^ <literal>org.xml.sax.EntityResolver</literal> ̎^邱Ƃɂčs܂B + ̂Ƃ <literal>EntityResolver</literal> ̎́A + XMLt@Cݍނ߂AX[_ibernateɓo^B + ̃JX^<literal>EntityResolver</literal> ̈قȂXeIDOŔFB + + + + + </para> + <itemizedlist> + <listitem> + <para> + + + a <literal>hibernate namespace</literal> is recognized whenever the + resolver encounteres a systemId starting with + <literal>http://hibernate.sourceforge.net/</literal>; the resolver + attempts to resolve these entities via the classlaoder which loaded + the Hibernate classes. + + + + + + <literal>HibernateO/literal> ́A]o + <literal>http://hibernate.sourceforge.net/</literal> Ŏn܂XeIDɓBƂ+ KFB + ă]óAHibernatẽNXɂă[hꂽNX[_āA + ̃GeBeB悤Ƃ܂B + + + + + </para> + </listitem> + <listitem> + <para> + + + a <literal>user namespace</literal> is recognized whenever the + resolver encounteres a systemId using a <literal>classpath://</literal> + URL protocol; the resolver will attempt to resolve these entities + via (1) the current thread context classloader and (2) the + classloader which loaded the Hibernate classes. + + + + + + + <literal>[UO/literal>́A]o + URLvgR<literal>classpath://</literal> VXeIDɓBƂ+ KFBă]óA(1)݂̃XbhReLXgāA܂+ (2)HibernatẽNXɂă[hꂽNX[_āA + ̃GeBeB悤Ƃ܂B + + + + </para> + </listitem> + </itemizedlist> + <para> + + An example of utilizing user namespacing: + + + + ĹA[UOF + + + </para> + <programlisting><![CDATA[<?xml version="1.0"?> +<!DOCTYPE hibernate-mapping PUBLIC + "-//Hibernate/Hibernate Mapping DTD 3.0//EN" + "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" [ + <!ENTITY types SYSTEM "classpath://your/domain/types.xml"> +]> + +<hibernate-mapping package="your.domain"> + <class name="MyEntity"> + <id name="id" type="my-custom-id-type"> + ... + </id> + <class> + &types; +</hibernate-mapping>]]></programlisting> + <para> + + + Where <literal>types.xml</literal> is a resource in the <literal>your.domain</literal> + package and contains a custom <xref linkend="mapping-types-custom">typedef</xref>. + + + + + + literal>types.xml</literal> <literal>your.domain</literal>pbP[W\[Xł + JX^ <xref linkend="mapping-types-custom">typedef</xref>ނ܂B + + + </para> + </sect3> + + </sect2> <sect2 id="mapping-declaration-mapping" revision="3"> Modified: trunk/Hibernate3/doc/reference/ja/modules/configuration.xml =================================================================== --- trunk/Hibernate3/doc/reference/ja/modules/configuration.xml 2006-07-31 20:27:50 UTC (rev 10182) +++ trunk/Hibernate3/doc/reference/ja/modules/configuration.xml 2006-08-01 09:29:01 UTC (rev 10183) @@ -689,9 +689,26 @@ JDBCgUNV̏ꍇA <literal>after_transaction</literal> ŃN[Y܂B <para> <emphasis role="strong"></emphasis> - <literal>on_close</literal> (default) | <literal>after_transaction</literal> | - <literal>after_statement</literal> | <literal>auto</literal> + <literal>auto</literal> (default) | <literal>on_close</literal> | + <literal>after_transaction</literal> | <literal>after_statement</literal> </para> + + <para> + Note that this setting only affects <literal>Session</literal>s returned from + <literal>SessionFactory.openSession</literal>. For <literal>Session</literal>s + obtained through <literal>SessionFactory.getCurrentSession</literal>, the + <literal>CurrentSessionContext</literal> implementation configured for use + controls the connection release mode for those <literal>Session</literal>s. + See <xref linkend="architecture-current-session"/> + + ӂĂB̐ݒ <literal>SessionFactory.openSession</literal> 擾 <literal>Session</literal> ɌB + <literal>SessionFactory.getCurrentSession</literal> Ď擾 + <literal>Session</literal> ł́A<literal>CurrentSessionContext</literal> + ̎ɂāARlNṼ[X[h肵܂B + <xref linkend="architecture-current-session"/> ƂĂB + </para> + </entry> </row> <row> @@ -906,7 +923,7 @@ </tgroup> </table> - <table frame="topbot" id="configuration-misc-properties" revision="9"> + <table frame="topbot" id="configuration-misc-properties" revision="10"> <title>̑̃vpeB</title> <tgroup cols="2"> <colspec colname="c1" colwidth="1*"/> @@ -929,7 +946,7 @@ <para> <emphasis role="strong"></emphasis> <literal>jta</literal> | <literal>thread</literal> | - <literal>custom.Class</literal> + <literal>managed</literal> | <literal>custom.Class</literal> </para> </entry> </row> Modified: trunk/Hibernate3/doc/reference/ja/modules/performance.xml =================================================================== --- trunk/Hibernate3/doc/reference/ja/modules/performance.xml 2006-07-31 20:27:50 UTC (rev 10182) +++ trunk/Hibernate3/doc/reference/ja/modules/performance.xml 2006-08-01 09:29:01 UTC (rev 10183) @@ -634,11 +634,23 @@ l܂LbVf[^o܂jB </para> - <para> - ftHgł́AHibernateVMx̃LbVHCache܂BiJCST|[g͌ݐ炸A - Hibernatȅ̃o[Wł͍폜ł傤jB <literal>hibernate.cache.provider_class</literal> - vpeBɁA <literal>org.hibernate.cache.CacheProvider</literal> NX̖O肷邱ƂŁA - ʂ̎邱Ƃ܂B + <para revision="1"> + + You have the option to tell Hibernate which caching implementation to use by + specifying the name of a class that implements <literal>org.hibernate.cache.CacheProvider</literal> + using the property <literal>hibernate.cache.provider_class</literal>. Hibernate + comes bundled with a number of built-in integrations with open-source cache providers + (listed below); additionally, you could implement your own and plug it in as + outlined above. Note that versions prior to 3.2 defaulted to use EhCache as the + default cache provider; that is no longer the case as of 3.2. + + HibernategpbV́A<literal>hibernate.cache.provider_class</literal> vpeB+ <literal>org.hibernate.cache.CacheProvider</literal> NX肷邱ƂŕύXł܂B + Hibernate͑̃I[v\[X̃LbVvoC_gCŎĂ܂iXgjB + āAOɐ悤ɁAȂgƎ̎āAgݍނƂ܂B + o[W3.2OłhCacheftHg̃LbVvoC_ł邱ƂɒӂĂB + o[W3.2ł͂Ă͂܂+ </para> <table frame="topbot" id="cacheproviders" revision="1"> Modified: trunk/Hibernate3/doc/reference/ja/modules/persistent_classes.xml =================================================================== --- trunk/Hibernate3/doc/reference/ja/modules/persistent_classes.xml 2006-07-31 20:27:50 UTC (rev 10182) +++ trunk/Hibernate3/doc/reference/ja/modules/persistent_classes.xml 2006-08-01 09:29:01 UTC (rev 10183) @@ -461,7 +461,7 @@ </sect1> - <sect1 id="persistent-classes-tuplizers" revision="0"> + <sect1 id="persistent-classes-tuplizers" revision="1"> <title>Tuplizer</title> <para> @@ -511,7 +511,7 @@ public class CustomMapTuplizerImpl - extends org.hibernate.tuple.DynamicMapEntityTuplizer { + extends org.hibernate.tuple.entity.DynamicMapEntityTuplizer { // override the buildInstantiator() method to plug in our custom map... protected final Instantiator buildInstantiator( org.hibernate.mapping.PersistentClass mappingInfo) { @@ -531,7 +531,7 @@ </sect1> <para> - <!-- TODO: vpeBƃvLVpbP[W̃[Ugt[[N邱--> + TODO: vpeBƃvLVpbP[W̃[Ugt[[N邱 </para> </chapter> Modified: trunk/Hibernate3/doc/reference/ja/modules/query_sql.xml =================================================================== --- trunk/Hibernate3/doc/reference/ja/modules/query_sql.xml 2006-07-31 20:27:50 UTC (rev 10182) +++ trunk/Hibernate3/doc/reference/ja/modules/query_sql.xml 2006-08-01 09:29:01 UTC (rev 10183) @@ -1,548 +1,874 @@ -<?xml version="1.0" encoding="Shift_JIS"?> -<chapter id="querysql" revision="2"> - <title>lCeBuSQL</title> - - <para>f[^x[X̃lCeBuSQLgăNG邱Ƃ܂B - NGqgacle<literal>CONNECT</literal> L[[ĥ悤ɁA - f[^x[XƎ̋@\𗘗pƂɎg܂B - SQL/JDBCڎgpĂvP[Vbernateւ̈ڍsՂɂĂ܂B</para> - - <para>Hibernate3ł́AAXVA폜Aǂݍݏ̂悤ȂׂĂ- SQLiXgAhvV[Wށjł܂B</para> - - <sect1 id="querysql-creating" revision="3"> - <title> <literal>SQLQuery</literal> ̎gp</title> - - <para>lCeBuQLNG̎s<literal>SQLQuery</literal> - C^[tFCXĐ䂵܂B - <literal>SQLQuery</literal> C^[tFCX- <literal>Session.createSQLQuery()</literal> яoĎ擾܂B - ɊȒPȏꍇÂ悤Ȍ`܂B</para> - - <programlisting><![CDATA[List cats = sess.createSQLQuery("select * from cats") - .addEntity(Cat.class) - .list();]]></programlisting> - - <para>̃NGŎw肳̂LɎ܂B</para> - - <itemizedlist> - <listitem> - <para>SQLNGara> - </listitem> - - <listitem> - <para>NGԂGeBeB</para> - </listitem> - </itemizedlist> - - <para>ł́A - UgZbǵ̗A}bsOt@CŎw肳ꂽƓƉ肳B - ̃e[uLNGł͖ƂȂB - ̌`́AdĂ݂ɂȂ/para> - - <programlisting><![CDATA[List cats = sess.createSQLQuery("select {cat.*} from cats cat") - .addEntity("cat", Cat.class) - .list();]]></programlisting> - - <para>̃NGŎw肳̂LɎ܂B</para> - - <itemizedlist> - <listitem> - <para>SQLNG iHibernateʖ߂̃v[Xz_ށj</para> - </listitem> - - <listitem> - <para>NGԂGeBeBQLe[u̕ʖ</para> - </listitem> - </itemizedlist> - - <para><literal>addEntity()</literal> \bhɂA - SQL̃e[uʖƕԂGeBeBNXAtA - NG̃UgZbg̍\肵܂B</para> - - <para><literal>addJoin()</literal> \bhA - ̃GeBeBƂ̊֘AƃRNV[h܂B</para> - - <programlisting><![CDATA[List cats = sess.createSQLQuery( - "select {cat.*}, {kitten.*} from cats cat, cats kitten where kitten.mother = cat.id" - ) - .addEntity("cat", Cat.class) - .addJoin("kitten", "cat.kittens") - .list();]]></programlisting> - - <para>lCeBuSQLNǴAPȃXJlJl- GeBeB̑gݍ킹ĂłB</para> - - <programlisting><![CDATA[Double max = (Double) sess.createSQLQuery("select max(cat.weight) as maxWeight from cats cat") - .addScalar("maxWeight", Hibernate.DOUBLE); - .uniqueResult();]]></programlisting> - - <para>Ahbmt@CɃUgZbg̃}bsOqA - NGŎgp邱Ƃł܂B</para> - - <programlisting><![CDATA[List cats = sess.createSQLQuery( - "select {cat.*}, {kitten.*} from cats cat, cats kitten where kitten.mother = cat.id" - ) - .setResultSetMapping("catAndKitten") - .list();]]></programlisting> - </sect1> - - <sect1 id="querysql-aliasreferences"> - <title>ʖƃvpeB̎Q/title> - <para><literal>{cat.*}</literal> Ƃ\ĹAuׂẴvpeBvȗ`łB - AIɃJĂłA - ̏ꍇ́AHibernateɊevpeBɑΉLʖł傤B - ʖ̂߂̃v[Xz_́Ae[u̕ʖɂďCvpeBłB - Ĺ̗Aʂ̃e[ui<literal>cat_log</literal>j }bsO^f[^Œꂽ <literal>Cat</literal> ܂B - DނȂwhere߂̒łAvpeB̕ʖ邱ƂɋCĂB</para> - - <para>OtNGɑ<literal>{}</literal> \͕K{ł<emphasis>Ȃ</emphasis> łB - <xref linkend="querysql-namedqueries"/> ƂĂB</para> - - <programlisting><![CDATA[String sql = "select cat.originalId as {cat.id}, " + - "cat.mateid as {cat.mate}, cat.sex as {cat.sex}, " + - "cat.weight*10 as {cat.weight}, cat.name as {cat.name} " + - "from cat_log cat where {cat.mate} = :catId" - -List loggedCats = sess.createSQLQuery(sql) - .addEntity("cat", Cat.class) - .setLong("catId", catId) - .list();]]></programlisting> - - <para><emphasis>ӁF</emphasis> IɊevpeB - NX <emphasis>ƃTuNX</emphasis> ׂ̂ẴvpeB߂ȂȂ/para> - - - <para>ʖɑ}̂\Ɏ܂B - ӁF\̕ʖ͈łB - ꂼʖ͈łgpɂ͂炭قȂ閼O܂B</para> - - <table frame="topbot" id="aliasinjection-summary"> - <title>ʖɑ}O</title> - - <tgroup cols="4"> - <colspec colwidth="1*" /> - - <colspec colwidth="1*" /> - - <colspec colwidth="2.5*" /> - - <thead> - <row> - <entry></entry> - <entry>\</entry> - <entry>entry> - </row> - </thead> - <tbody> - <row> - <entry>PȃvpeB</entry> - <entry><literal>{[aliasname].[propertyname]}</literal></entry> - <entry><literal>A_NAME as {item.name}</literal></entry> - </row> - <row> - <entry>vpeB</entry> - <entry><literal>{[aliasname].[componentname].[propertyname]}</literal></entry> - <entry><literal>CURRENCY as {item.amount.currency}, VALUE as {item.amount.value}</literal></entry> - </row> - <row> - <entry>GeBeB̃NXʂ</entry> - <entry><literal>{[aliasname].class}</literal></entry> - <entry><literal>DISC as {item.class}</literal></entry> - </row> - <row> - <entry>GeBeB̑SvpeB</entry> - <entry><literal>{[aliasname].*}</literal></entry> - <entry><literal>{item.*}</literal></entry> - </row> - <row> - <entry>RNṼL[</entry> - <entry><literal>{[aliasname].key}</literal></entry> - <entry><literal>ORGID as {coll.key}</literal></entry> - </row> - <row> - <entry>RNVD</entry> - <entry><literal>{[aliasname].id}</literal></entry> - <entry><literal>EMPID as {coll.id}</literal></entry> - </row> - <row> - <entry>RNV̗vf</entry> - <entry><literal>{[aliasname].element}</literal></entry> - <entry><literal>XID as {coll.element}</literal></entry> - <entry></entry> - </row> - <row> - <entry>RNV̗vf̃vpeB</entry> - <entry><literal>{[aliasname].element.[propertyname]}</literal></entry> - <entry><literal>NAME as {coll.element.name}</literal></entry> - </row> - <row> - <entry>RNV̗vf̑SvpeB</entry> - <entry><literal>{[aliasname].element.*}</literal></entry> - <entry><literal>{coll.element.*}</literal></entry> - </row> - <row> - <entry>RNV̑SvpeB</entry> - <entry><literal>{[aliasname].*}</literal></entry> - <entry><literal>{coll.*}</literal></entry> - </row> - </tbody> - </tgroup> - </table> - </sect1> - - <sect1 id="querysql-namedqueries" revision="3"> - <title>OtSQLNG</title> - - <para>OtSQLNG̓}bsOhLgŒ邱ƂłA - OtHQLNGƑSĂԂƂł܂B - ̏ꍇA<literal>addEntity()</literal> яoKv<emphasis>Ȃ</emphasis> łB</para> - - <programlisting><![CDATA[<sql-query name="persons"> - <return alias="person" class="eg.Person"/> - SELECT person.NAME AS {person.name}, - person.AGE AS {person.age}, - person.SEX AS {person.sex} - FROM PERSON person - WHERE person.NAME LIKE :namePattern -</sql-query>]]></programlisting> - - <programlisting><![CDATA[List people = sess.getNamedQuery("persons") - .setString("namePattern", namePattern) - .setMaxResults(50) - .list();]]></programlisting> - - <para>֘A邽߂ƃRNVG`邽߂ɁAꂼ <literal><return-join></literal> <literal><load-collection></literal> - vf܂B</para> - - <programlisting><![CDATA[<sql-query name="personsWith"> - <return alias="person" class="eg.Person"/> - <return-join alias="address" property="person.mailingAddress"/> - SELECT person.NAME AS {person.name}, - person.AGE AS {person.age}, - person.SEX AS {person.sex}, - adddress.STREET AS {address.street}, - adddress.CITY AS {address.city}, - adddress.STATE AS {address.state}, - adddress.ZIP AS {address.zip} - FROM PERSON person - JOIN ADDRESS adddress - ON person.ID = address.PERSON_ID AND address.TYPE='MAILING' - WHERE person.NAME LIKE :namePattern -</sql-query>]]></programlisting> - - <para>OtSQLNG̓XJlƂ܂B - <literal><return-scalar></literal> vfāA - ʖibernatě^ȂȂ/para> - - <programlisting><![CDATA[<sql-query name="mySqlQuery"> - <return-scalar column="name" type="string"/> - <return-scalar column="age" type="long"/> - SELECT p.NAME AS name, - p.AGE AS age, - FROM PERSON p WHERE p.NAME LIKE 'Hiber%' -</sql-query>]]></programlisting> - - - <para>UgZbg̃}bsOiteral><resultset></literal> - ɊOo邱Ƃł܂B - ̖OtNGōėp<literal>setResultSetMapping()</literal> - APIčėp܂B - </para> - - <programlisting><![CDATA[<resultset name="personAddress"> - <return alias="person" class="eg.Person"/> - <return-join alias="address" property="person.mailingAddress"/> -</resultset> - -<sql-query name="personsWith" resultset-ref="personAddress"> - SELECT person.NAME AS {person.name}, - person.AGE AS {person.age}, - person.SEX AS {person.sex}, - adddress.STREET AS {address.street}, - adddress.CITY AS {address.city}, - adddress.STATE AS {address.state}, - adddress.ZIP AS {address.zip} - FROM PERSON person - JOIN ADDRESS adddress - ON person.ID = address.PERSON_ID AND address.TYPE='MAILING' - WHERE person.NAME LIKE :namePattern -</sql-query>]]></programlisting> - - <sect2 id="propertyresults"> - <title>ʖIɎw肷邽߂return-property </title> - - <para>ʖ߂<literal>{}</literal> \A - <literal><return-property></literal> A - ǂ̗ʖ̂ł܂B</para> - - <programlisting><![CDATA[<sql-query name="mySqlQuery"> - <return alias="person" class="eg.Person"> - <return-property name="name" column="myName"/> - <return-property name="age" column="myAge"/> - <return-property name="sex" column="mySex"/> - </return> - SELECT person.NAME AS myName, - person.AGE AS myAge, - person.SEX AS mySex, - FROM PERSON person WHERE person.NAME LIKE :name -</sql-query> -]]></programlisting> - - <para><literal><return-property></literal> ͕̗܂B - AvpeBߍׂȂƂA - <literal>{}</literal> \̐܂B</para> - - <programlisting><![CDATA[<sql-query name="organizationCurrentEmployments"> - <return alias="emp" class="Employment"> - <return-property name="salary"> - <return-column name="VALUE"/> - <return-column name="CURRENCY"/> - </return-property> - <return-property name="endDate" column="myEndDate"/> - </return> - SELECT EMPLOYEE AS {emp.employee}, EMPLOYER AS {emp.employer}, - STARTDATE AS {emp.startDate}, ENDDATE AS {emp.endDate}, - REGIONCODE as {emp.regionCode}, EID AS {emp.id}, VALUE, CURRENCY - FROM EMPLOYMENT - WHERE EMPLOYER = :id AND ENDDATE IS NULL - ORDER BY STARTDATE ASC -</sql-query>]]></programlisting> - - <para>̗́A}߂<literal>{}</literal> \ƂA - <literal><return-property></literal> Ă邱ƂɒӂĂB - vpeB̂悤ɎQƂ邩ׂ܂B</para> - - <para>}bsOdiscriminator ܂܂A - discriminator ̗w肷邽߂ɁA<return-discriminator> - Ȃ/para> - </sect2> - - <sect2 id="sp_query" revision="1"> - <title>₢킹邽߂ɃXgAhvV[W</title> - - <para>Hibernate̓o[W3XgAhvV[WƃXgAhoR̖₢킹 - T|[gB - ȍ~̑́̕AĂ͂܂B - XgAhvV[WgAhernateŎg߂ɂ́A - 1Ԗڂ̏o̓p[^ƂăUgZbgȂȂ- Oracle 9i͂o[Wj̃XgAhvV[W̗ȉɎ܂B</para> - - <programlisting><![CDATA[CREATE OR REPLACE FUNCTION selectAllEmployments - RETURN SYS_REFCURSOR -AS - st_cursor SYS_REFCURSOR; -BEGIN - OPEN st_cursor FOR - SELECT EMPLOYEE, EMPLOYER, - STARTDATE, ENDDATE, - REGIONCODE, EID, VALUE, CURRENCY - FROM EMPLOYMENT; - RETURN st_cursor; - END;]]></programlisting> - - <para>Hibernateł̃NG߂ɂ́A - OtNGŃ}bsOvB</para> - - <programlisting><![CDATA[<sql-query name="selectAllEmployees_SP" callable="true"> - <return alias="emp" class="Employment"> - <return-property name="employee" column="EMPLOYEE"/> - <return-property name="employer" column="EMPLOYER"/> - <return-property name="startDate" column="STARTDATE"/> - <return-property name="endDate" column="ENDDATE"/> - <return-property name="regionCode" column="REGIONCODE"/> - <return-property name="id" column="EID"/> - <return-property name="salary"> - <return-column name="VALUE"/> - <return-column name="CURRENCY"/> - </return-property> - </return> - { ? = call selectAllEmployments() } -</sql-query>]]></programlisting> - - <para>ӁF̂ƂXgAhvV[W̓XJƃGeBeB݂̂łB - <literal><return-join></literal> <literal><load-collection></literal> - ̓T|[g܂/para> - - <sect3 id="querysql-limits-storedprocedures" revision="1"> - <title>XgAhvV[W̃[Ɛ/title> - - <para>HibernateŃXgAhvV[W߂ɂ́A - ̃vV[W͂̃[ɏvB - [ɏĂȂvV[ẂAHibernateŎgƂ͂ł܂- ĂȂvV[ŴłA - <literal>session.connection()</literal> ĎsȂȂ- [̓f[^x[XƂɈقȂB - XgAhvV[W̃Z}eBbNXƃV^bNX́A - f[^x[Xx_ƂɈقȂ邽߂łB</para> - - <para><literal>setFirstResult()/setMaxResults()</literal> āA - XgAhvV[WNG[W邱Ƃ͂ł܂/para> - - <para>яoWłL92ɏ]ƂłB - <literal>{ ? = call functionName(<parameters>) }</literal> <literal>{ ? = call procedureName(<parameters>) }</literal> łB - lCeBuȌĂяo\̓T|[g܂/para> - - <para>Oracleɂ͉L̃[KpB</para> - - <itemizedlist spacing="compact"> - <listitem> - <para>̓UgZbgȂȂ- vV[W̑UgZbg߁A - <literal>OUT</literal> łȂȂ- Oracle 90ł́A<literal>SYS_REFCURSOR</literal> ƂɂĂł܂B - Oracleł<literal>REF CURSOR</literal> ^`vB - Oracle̕ƂĂB</para> - </listitem> - </itemizedlist> - - <para>SybaseS SQLT[o[ɓKp[LɎ܂B</para> - - <itemizedlist spacing="compact"> - <listitem> - <para>vV[W̓UgZbgȂȂ- T[o[͕̃UgZbgƍXVJEg܂A - Hibernateڂ̃UgZbgƂɒӂĂB - ׂ̑͂Ď̂Ă܂B</para> - </listitem> - - <listitem> - <para>vV[W̒<literal>SET NOCOUNT ON</literal> A - 炭悭Ȃ傤B - AKvł͂/para> - </listitem> - </itemizedlist> - </sect3> - </sect2> - </sect1> - - <sect1 id="querysql-cud"> - <title>쐬AXVA폜̂߂̃JX^SQL</title> - - <para>Hibernate3͍쐬AXVA폜̂߂̃JX^SQLpł܂B - NXƃRNV̉i@\́ARtBO[Vɐꂽ iinsertsqlAdeletesqlAupdatesqlȂǁj̃ZbgłɕێĂ܂B - ̕ - <literal><sql-insert></literal>A - <literal><sql-delete></literal>A - <literal><sql-update></literal> Ƃ}bsO^OD悳B</para> - - <programlisting><![CDATA[<class name="Person"> - <id name="id"> - <generator class="increment"/> - </id> - <property name="name" not-null="true"/> - <sql-insert>INSERT INTO PERSON (NAME, ID) VALUES ( UPPER(?), ? )</sql-insert> - <sql-update>UPDATE PERSON SET NAME=UPPER(?) WHERE ID=?</sql-update> - <sql-delete>DELETE FROM PERSON WHERE ID=?</sql-delete> -</class>]]></programlisting> - - <para>SQLڃf[^x[XŎs邽߁AD݂̕RɎgpł܂B - f[^x[XƎQLAR}bsÕ|[^reBB</para> - - <para><literal>callable</literal> bgA - XgAhvV[Wpł܂B</para> - - <programlisting><![CDATA[<class name="Person"> - <id name="id"> - <generator class="increment"/> - </id> - <property name="name" not-null="true"/> - <sql-insert callable="true">{call createPerson (?, ?)}</sql-insert> - <sql-delete callable="true">{? = call deletePerson (?)}</sql-delete> - <sql-update callable="true">{? = call updatePerson (?, ?)}</sql-update> -</class>]]></programlisting> - - <para>̂Ƃʒup[^̏Ԃ͂ƂĂvłB - Ȃ킿AHibernate鏇łȂȂ/para> - - <para><literal>org.hiberante.persister.entity</literal> x̃fobOO L邱ƂɂāAԂ߂܂B - ̃x邱ƂɂAGeBeB̍쐬AXVA폜Ȃǂ- gpÓIQLo͂B - iF邽߂ɂ́AHibernateIQL[o[Ch JX^SQLbsOt@CɊ܂߂ȂƂłBj</para> - - <para>XgAhvV[W͑}/폜ꂽsKv - iǂݍ݂̏ꍇ́AԂȂ͕ԂłjB - sibernateSQL̐`FbN邩B - HibernatéACUD̂߂̐l̏o̓p[^ƂāA - SQL̍ŏ̃p[^^܂B</para> - - <programlisting><![CDATA[CREATE OR REPLACE FUNCTION updatePerson (uid IN NUMBER, uname IN VARCHAR2) - RETURN NUMBER IS -BEGIN - - update PERSON - set - NAME = uname, - where - ID = uid; - - return SQL%ROWCOUNT; - -END updatePerson;]]></programlisting> - </sect1> - - <sect1 id="querysql-load"> - <title>[ĥ߂̃JX^SQL</title> - - <para>GeBeBݍނ߂̓ƎQLiQLjNGł܂B</para> - - <programlisting><![CDATA[<sql-query name="person"> - <return alias="pers" class="Person" lock-mode="upgrade"/> - SELECT NAME AS {pers.name}, ID AS {pers.id} - FROM PERSON - WHERE ID=? - FOR UPDATE -</sql-query>]]></programlisting> - - <para>A܂ɁiȑOc_jOtNG̐錾łB - ̖OtNGX̃}bsOƂł܂B</para> - - <programlisting><![CDATA[<class name="Person"> - <id name="id"> - <generator class="increment"/> - </id> - <property name="name" not-null="true"/> - <loader query-ref="person"/> -</class>]]></programlisting> - - - <para>XgAhvV[Wł삵܂B</para> - - <para>̂悤ɁARNV[h邽߂̃NGĂ悢łB</para> - - <programlisting><![CDATA[<set name="employments" inverse="true"> - <key/> - <one-to-many class="Employment"/> - <loader query-ref="employments"/> -</set>]]></programlisting> - - <programlisting><![CDATA[<sql-query name="employments"> - <load-collection alias="emp" role="Person.employments"/> - SELECT {emp.*} - FROM EMPLOYMENT emp - WHERE EMPLOYER = :id - ORDER BY STARTDATE ASC, EMPLOYEE ASC -</sql-query>]]></programlisting> - - <para>̂悤ɁAtFb`ɂRNV[h GeBeB[_[`ł܂B</para> - - <programlisting><![CDATA[<sql-query name="person"> - <return alias="pers" class="Person"/> - <return-join alias="emp" property="pers.employments"/> - SELECT NAME AS {pers.*}, {emp.*} - FROM PERSON pers - LEFT OUTER JOIN EMPLOYMENT emp - ON pers.ID = emp.PERSON_ID - WHERE ID=? -</sql-query>]]></programlisting> - </sect1> - +<?xml version="1.0" encoding="Shift_JIS"?> +<chapter id="querysql" revision="2"> + <title>lCeBuSQL</title> + + <para>f[^x[X̃lCeBuSQLgăNG邱Ƃ܂B + NGqgacle<literal>CONNECT</literal> L[[ĥ悤ɁA + f[^x[XƎ̋@\𗘗pƂɎg܂B + SQL/JDBCڎgpĂvP[Vbernateւ̈ڍsՂɂĂ܂B</para> + + <para>Hibernate3ł́AAXVA폜Aǂݍݏ̂悤ȂׂĂ+ SQLiXgAhvV[Wށjł܂B</para> + + <sect1 id="querysql-creating" revision="4"> + <title><literal>SQLQuery</literal> ̎gp</title> + + <para>lCeBuQLNG̎s<literal>SQLQuery</literal> + C^[tFCXĐ䂵܂B + <literal>SQLQuery</literal> C^[tFCX+ <literal>Session.createSQLQuery()</literal> яoĎ擾܂B + The following describes how to use this API for querying. + PIĖ₢킹@Ő܂B</para> +܂+ + <sect2> + <title>Scalar queries@@XJ[̃NG</title> + + <para>The most basic SQL query is to get a list of scalars + (values).</para> + + <para>ł{IQLNG̓XJ[ilj̃Xg邱ƂłB</para> + + <programlisting><![CDATA[sess.createSQLQuery("SELECT * FROM CATS").list(); +sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE FROM CATS").list(); +]]></programlisting> + + <para>These will both return a List of Object arrays (Object[]) with + scalar values for each column in the CATS table. Hibernate will use + ResultSetMetadata to deduce the actual order and types of the returned + scalar values.</para> + + <para>͂ǂACATSe[ůeJ̃XJ[l+ Objectzbject[]j̃Xg܂B + ԂXJ[l̎ۂ̏Ԃƌ^𐄘_邽߂ɁA + HibernateesultSetMetadatap܂B</para> + + <para>To avoid the overhead of using + <literal>ResultSetMetadata</literal> or simply to be more explicit in + what is returned one can use <literal>addScalar()</literal>.</para> + + <para><literal>ResultSetMetadata</literal> p[o[wbh邽߁A + ͒PɉԂmɂ邽߁A<literal>addScalar()</literal> + ܂B</para> + + <programlisting><![CDATA[sess.createSQLQuery("SELECT * FROM CATS") + .addScalar("ID", Hibernate.LONG) + .addScalar("NAME", Hibernate.STRING) + .addScalar("BIRTHDATE", Hibernate.DATE) +]]></programlisting> + + <para>This query specified:</para> + + <para>̃NGŎw肳̂LɎ܂B</para> + + <itemizedlist> + <listitem> + <para>the SQL query string</para> + <para>SQLNGara> + </listitem> + + <listitem> + <para>the columns and types to return</para> + <para>ԂJƌ^</para> + </listitem> + </itemizedlist> + + <para>This will still return Object arrays, but now it will not use + <literal>ResultSetMetdata</literal> but will instead explicitly get the + ID, NAME and BIRTHDATE column as respectively a Long, String and a Short + from the underlying resultset. This also means that only these three + columns will be returned, even though the query is using + <literal>*</literal> and could return more than the three listed + columns.</para> + + <para>܂ObjectzԂ܂A + <literal>ResultSetMetdata</literal> p܂+ Ȃɂ郊UgZbg IDANAMEABIRTHDATE Jꂼ LongAStringAShort ƂĖIɎ擾܂B + R̃Ĵ݂ł邱Ƃ܂B + ƂANG <literal>*</literal> pA + R̃JĂB</para> + + <para>It is possible to leave out the type information for all or some + of the scalars.</para> + + <para>XJ[̌^Ƃ܂B</para> + + <programlisting><![CDATA[sess.createSQLQuery("SELECT * FROM CATS") + .addScalar("ID", Hibernate.LONG) + .addScalar("NAME") + .addScalar("BIRTHDATE") +]]></programlisting> + + <para>This is essentially the same query as before, but now + <literal>ResultSetMetaData</literal> is used to decide the type of NAME + and BIRTHDATE where as the type of ID is explicitly specified.</para> + + <para>{IɑOƓNGłA + NAME BIRTHDATE ̌^߂邽߂<literal>ResultSetMetaData</literal> + p܂BID ̌^͖IɎw肳܂Biwhere as ̖/para> + + <para>How the java.sql.Types returned from ResultSetMetaData is mapped + to Hibernate types is controlled by the Dialect. If a specific type is + not mapped or does not result in the expected type it is possible to + customize it via calls to <literal>registerHibernateType</literal> in + the Dialect.</para> + + <para> + ResultSetMetaData java.sql.Types bernate ̌^+ }bsO邱Ƃ́ADialect 䂵܂B + ꂽ^}bsOȂAʂ̌^ƈقȂA + Dialect <literal>registerHibernateType</literal> яoA + JX^}CYł܂B + </para> + </sect2> + + <sect2> + <title>Entity queries@@GeBeB NG</title> + + <para>The above queries were all about returning scalar values, + basically returning the "raw" values from the resultset. The following + shows how to get entity objects from a native sql query via + <literal>addEntity()</literal>.</para> + + <para>܂ł̃NǴAׂăXJ[lłB + IɁAUgZbgHv̒l܂B + ȍ~ł́A<literal>addEntity()</literal> ɂAlCeBuSQLNG GeBeBIuWFNg@܂B</para> + + <programlisting><![CDATA[sess.createSQLQuery... [truncated message content] |
From: <hib...@li...> - 2006-07-31 20:27:54
|
Author: scottmarlownovell Date: 2006-07-31 16:27:50 -0400 (Mon, 31 Jul 2006) New Revision: 10182 Modified: trunk/Hibernate3/src/org/hibernate/tool/instrument/cglib/InstrumentTask.java Log: fix for HHH-1931, don't transform methods that accept classes that aren't instrumented. Modified: trunk/Hibernate3/src/org/hibernate/tool/instrument/cglib/InstrumentTask.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/tool/instrument/cglib/InstrumentTask.java 2006-07-28 20:17:50 UTC (rev 10181) +++ trunk/Hibernate3/src/org/hibernate/tool/instrument/cglib/InstrumentTask.java 2006-07-31 20:27:50 UTC (rev 10182) @@ -43,21 +43,22 @@ * Override the {@link AbstractTransformTask#getClassTransformer} method * in order to define field access interception transformation should occur. */ - protected ClassTransformer getClassTransformer(String[] classInfo) { + protected ClassTransformer getClassTransformer(final String[] classInfo) { if ( Arrays.asList( classInfo ).contains( InterceptFieldEnabled.class.getName() ) ) { // The class is already instrumented, so skip this step return null; } else { + // Class was not yet enhanced, so apply the transformation return new InterceptFieldTransformer( new InterceptFieldFilter() { public boolean acceptRead(Type owner, String name) { - return true; + return (owner.getClassName().equals(classInfo[0])); } public boolean acceptWrite(Type owner, String name) { - return true; + return (owner.getClassName().equals(classInfo[0])); } } ); |
From: <hib...@li...> - 2006-07-28 22:18:37
|
Author: epbernard Date: 2006-07-26 09:36:20 -0400 (Wed, 26 Jul 2006) New Revision: 10159 Modified: trunk/Hibernate3/test/org/hibernate/test/hql/EJBQLTest.java Log: HHH-1948 test Modified: trunk/Hibernate3/test/org/hibernate/test/hql/EJBQLTest.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/hql/EJBQLTest.java 2006-07-26 13:00:00 UTC (rev 10158) +++ trunk/Hibernate3/test/org/hibernate/test/hql/EJBQLTest.java 2006-07-26 13:36:20 UTC (rev 10159) @@ -18,6 +18,7 @@ import org.hibernate.hql.ast.QueryTranslatorImpl; import org.hibernate.hql.ast.util.ASTUtil; import org.hibernate.test.TestCase; +import org.hibernate.Session; import antlr.RecognitionException; import antlr.TokenStreamException; @@ -217,6 +218,11 @@ assertEjbqlEqualsHql( "from Human h where not(h.pregnant is true)", "from Human h where not( h.pregnant=true )" ); } + public void testIdentifierCaseSensitive() throws Exception { + Session s = openSession( ); + s.createQuery( "select object(H) from Human h").list(); + s.close(); + } // Private private void assertEjbqlEqualsHql(String ejbql, String hql) { |
From: <hib...@li...> - 2006-07-28 22:11:43
|
Author: ste...@jb... Date: 2006-07-26 13:05:35 -0400 (Wed, 26 Jul 2006) New Revision: 10169 Modified: trunk/Hibernate3/test/org/hibernate/test/AllTests.java Log: proper util suite Modified: trunk/Hibernate3/test/org/hibernate/test/AllTests.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/AllTests.java 2006-07-26 17:04:14 UTC (rev 10168) +++ trunk/Hibernate3/test/org/hibernate/test/AllTests.java 2006-07-26 17:05:35 UTC (rev 10169) @@ -134,6 +134,7 @@ import org.hibernate.test.abstractembeddedcomponents.propertyref.AbstractComponentPropertyRefTest; import org.hibernate.test.abstractembeddedcomponents.cid.AbstractCompositeIdTest; import org.hibernate.test.jpa.JPAComplianceSuite; +import org.hibernate.test.util.UtilSuite; import org.hibernate.dialect.Dialect; /** @@ -300,6 +301,7 @@ suite.addTest( JPAComplianceSuite.suite() ); suite.addTest( AbstractComponentPropertyRefTest.suite() ); suite.addTest( AbstractCompositeIdTest.suite() ); + suite.addTest( UtilSuite.suite() ); return filter( suite ); //return suite; |
From: <hib...@li...> - 2006-07-28 22:07:16
|
Author: max...@jb... Date: 2006-07-26 11:12:52 -0400 (Wed, 26 Jul 2006) New Revision: 10165 Modified: trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/Version.java Log: Modified: trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/Version.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/Version.java 2006-07-26 15:09:20 UTC (rev 10164) +++ trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/Version.java 2006-07-26 15:12:52 UTC (rev 10165) @@ -5,7 +5,7 @@ final public class Version { - public static final String VERSION = "3.2.0.beta6"; + public static final String VERSION = "3.2.0.beta6a"; private static final Version instance = new Version(); |
From: <hib...@li...> - 2006-07-28 22:01:32
|
Author: max...@jb... Date: 2006-07-28 03:34:29 -0400 (Fri, 28 Jul 2006) New Revision: 10178 Modified: branches/Branch_3_2/Hibernate3/test/org/hibernate/test/TestCase.java Log: hurray Modified: branches/Branch_3_2/Hibernate3/test/org/hibernate/test/TestCase.java =================================================================== --- branches/Branch_3_2/Hibernate3/test/org/hibernate/test/TestCase.java 2006-07-27 21:51:51 UTC (rev 10177) +++ branches/Branch_3_2/Hibernate3/test/org/hibernate/test/TestCase.java 2006-07-28 07:34:29 UTC (rev 10178) @@ -381,7 +381,8 @@ public void runBare() throws Throwable { assertNotNull(getName()); - if(Boolean.getBoolean( "hibernate.test.validatefailureexpected" )) { + String string = "hibernate.test.validatefailureexpected"; + if(Boolean.getBoolean( string )) { if(getName().endsWith( "FailureExpected" ) ) { Throwable t = null; try { |
From: <hib...@li...> - 2006-07-28 21:39:54
|
Author: ste...@jb... Date: 2006-07-26 13:00:46 -0400 (Wed, 26 Jul 2006) New Revision: 10167 Added: trunk/Hibernate3/test/org/hibernate/test/util/dtd/ trunk/Hibernate3/test/org/hibernate/test/util/dtd/Child.java trunk/Hibernate3/test/org/hibernate/test/util/dtd/EntityResolverTest.java trunk/Hibernate3/test/org/hibernate/test/util/dtd/Parent.hbm.xml trunk/Hibernate3/test/org/hibernate/test/util/dtd/Parent.java trunk/Hibernate3/test/org/hibernate/test/util/dtd/child.xml Log: added test of classpath-based EntityResolver code Added: trunk/Hibernate3/test/org/hibernate/test/util/dtd/Child.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/util/dtd/Child.java 2006-07-26 15:13:29 UTC (rev 10166) +++ trunk/Hibernate3/test/org/hibernate/test/util/dtd/Child.java 2006-07-26 17:00:46 UTC (rev 10167) @@ -0,0 +1,36 @@ +package org.hibernate.test.util.dtd; + +/** + * The Child class. + * + * @author Steve Ebersole + */ +public class Child { + private Long id; + private int age; + private Parent parent; + + public Child() { + } + + public Long getId() { + return id; + } + + public Parent getParent() { + return parent; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + + /*package*/ void injectParent(Parent parent) { + this.parent = parent; + } +} Added: trunk/Hibernate3/test/org/hibernate/test/util/dtd/EntityResolverTest.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/util/dtd/EntityResolverTest.java 2006-07-26 15:13:29 UTC (rev 10166) +++ trunk/Hibernate3/test/org/hibernate/test/util/dtd/EntityResolverTest.java 2006-07-26 17:00:46 UTC (rev 10167) @@ -0,0 +1,22 @@ +package org.hibernate.test.util.dtd; + +import junit.framework.TestCase; +import org.hibernate.cfg.Configuration; + + +/** + * todo: describe EntityResolverTest + * + * @author Steve Ebersole + */ +public class EntityResolverTest extends TestCase { + public EntityResolverTest(String name) { + super( name ); + } + + public void testEntityIncludeResolution() { + Configuration cfg = new Configuration(); + cfg.addResource( "org/hibernate/test/util/dtd/Parent.hbm.xml" ); + cfg.buildMappings(); + } +} Added: trunk/Hibernate3/test/org/hibernate/test/util/dtd/Parent.hbm.xml =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/util/dtd/Parent.hbm.xml 2006-07-26 15:13:29 UTC (rev 10166) +++ trunk/Hibernate3/test/org/hibernate/test/util/dtd/Parent.hbm.xml 2006-07-26 17:00:46 UTC (rev 10167) @@ -0,0 +1,24 @@ +<?xml version="1.0"?> +<!DOCTYPE hibernate-mapping PUBLIC + "-//Hibernate/Hibernate Mapping DTD 3.0//EN" + "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" [ + <!ENTITY child SYSTEM "classpath://org/hibernate/test/util/dtd/child.xml"> +]> + + +<hibernate-mapping package="org.hibernate.test.util.dtd" default-access="field"> + + <class name="Parent"> + <id name="id" column="ID"> + <generator class="increment"/> + </id> + <list name="children" inverse="true" cascade="persist,merge"> + <key column="PRNT_ID" not-null="true"/> + <list-index column="SIBLING_ORD"/> + <one-to-many class="Child"/> + </list> + </class> + + &child; + +</hibernate-mapping> Added: trunk/Hibernate3/test/org/hibernate/test/util/dtd/Parent.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/util/dtd/Parent.java 2006-07-26 15:13:29 UTC (rev 10166) +++ trunk/Hibernate3/test/org/hibernate/test/util/dtd/Parent.java 2006-07-26 17:00:46 UTC (rev 10167) @@ -0,0 +1,33 @@ +package org.hibernate.test.util.dtd; + +import java.util.Set; +import java.util.HashSet; +import java.util.Iterator; + +/** + * The Parent class. + * + * @author Steve Ebersole + */ +public class Parent { + private Long id; + private Set children = new HashSet(); + + public Long getId() { + return id; + } + + public Iterator getChildren() { + return children.iterator(); + } + + public Child newChild() { + Child child = new Child(); + child.setAge( 0 ); + + child.injectParent( this ); + this.children.add( child ); + + return child; + } +} Added: trunk/Hibernate3/test/org/hibernate/test/util/dtd/child.xml =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/util/dtd/child.xml 2006-07-26 15:13:29 UTC (rev 10166) +++ trunk/Hibernate3/test/org/hibernate/test/util/dtd/child.xml 2006-07-26 17:00:46 UTC (rev 10167) @@ -0,0 +1,9 @@ + + + <class name="Child"> + <id name="id" column="ID"> + <generator class="increment"/> + </id> + <property name="age" column="AGE" not-null="true"/> + <many-to-one name="parent" class="Parent" column="PRNT_ID"/> + </class> \ No newline at end of file |
From: <hib...@li...> - 2006-07-28 21:38:39
|
Author: max...@jb... Date: 2006-07-27 03:20:51 -0400 (Thu, 27 Jul 2006) New Revision: 10175 Modified: trunk/Hibernate3/build.xml Log: let the nightly build control failureexpected Modified: trunk/Hibernate3/build.xml =================================================================== --- trunk/Hibernate3/build.xml 2006-07-26 20:11:52 UTC (rev 10174) +++ trunk/Hibernate3/build.xml 2006-07-27 07:20:51 UTC (rev 10175) @@ -69,6 +69,8 @@ <property name="replace.dir" value="${src.dir}"/> + <property name="hibernate.test.validatefailureexpected" value="false"/> + <path id="lib.class.path"> <fileset dir="${lib.dir}"> <include name="**/*.jar"/> @@ -525,6 +527,7 @@ --> <junit printsummary="yes" haltonfailure="yes" dir="${basedir}" maxmemory="256M" fork="yes" forkmode="perBatch"> + <jvmarg value="-Dhibernate.test.validatefailureexpected=${hibernate.test.validatefailureexpected}"/> <classpath> <fileset dir="${lib.dir}"> <include name="**/*.jar"/> @@ -561,6 +564,7 @@ <mkdir dir="${instrumenttest.out.dir}"/> <junit printsummary="yes" haltonfailure="yes" dir="${basedir}" maxmemory="256M" fork="yes" forkmode="perBatch"> + <jvmarg value="-Dhibernate.test.validatefailureexpected=${hibernate.test.validatefailureexpected}"/> <classpath> <fileset dir="${lib.dir}"> <include name="**/*.jar"/> @@ -594,6 +598,7 @@ description="Run the performance tests"> <mkdir dir="${test.out.dir}"/> <junit printsummary="yes" fork="yes" haltonfailure="yes" dir="${basedir}"> + <jvmarg value="-Dhibernate.test.validatefailureexpected=${hibernate.test.validatefailureexpected}"/> <classpath> <fileset dir="${lib.dir}"> <include name="**/*.jar"/> @@ -642,6 +647,7 @@ description="Run a single test suite (requires testname and jdbc.driver properties)"> <mkdir dir="${test.out.dir}"/> <junit printsummary="yes" maxmemory="256M" fork="yes" haltonfailure="yes" dir="${basedir}"> + <jvmarg value="-Dhibernate.test.validatefailureexpected=${hibernate.test.validatefailureexpected}"/> <classpath> <pathelement path="${etc.dir}"/> <!-- pick up property resources from the 'etc' directory first --> <fileset dir="${lib.dir}"> |
From: <hib...@li...> - 2006-07-28 21:23:10
|
Author: max...@jb... Date: 2006-07-28 03:34:40 -0400 (Fri, 28 Jul 2006) New Revision: 10179 Modified: trunk/Hibernate3/test/org/hibernate/test/TestCase.java Log: hurray Modified: trunk/Hibernate3/test/org/hibernate/test/TestCase.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/TestCase.java 2006-07-28 07:34:29 UTC (rev 10178) +++ trunk/Hibernate3/test/org/hibernate/test/TestCase.java 2006-07-28 07:34:40 UTC (rev 10179) @@ -382,7 +382,6 @@ public void runBare() throws Throwable { assertNotNull(getName()); String string = "hibernate.test.validatefailureexpected"; - System.out.println(string + " is set to [" + System.getProperty( string ) + "]"); if(Boolean.getBoolean( string )) { if(getName().endsWith( "FailureExpected" ) ) { Throwable t = null; |
From: <hib...@li...> - 2006-07-28 21:08:31
|
Author: max...@jb... Date: 2006-07-27 03:25:43 -0400 (Thu, 27 Jul 2006) New Revision: 10176 Modified: branches/Branch_3_2/Hibernate3/build.xml Log: merge from HEAD to 3.2 build.xml Modified: branches/Branch_3_2/Hibernate3/build.xml =================================================================== --- branches/Branch_3_2/Hibernate3/build.xml 2006-07-27 07:20:51 UTC (rev 10175) +++ branches/Branch_3_2/Hibernate3/build.xml 2006-07-27 07:25:43 UTC (rev 10176) @@ -69,6 +69,8 @@ <property name="replace.dir" value="${src.dir}"/> + <property name="hibernate.test.validatefailureexpected" value="false"/> + <path id="lib.class.path"> <fileset dir="${lib.dir}"> <include name="**/*.jar"/> @@ -525,6 +527,7 @@ --> <junit printsummary="yes" haltonfailure="yes" dir="${basedir}" maxmemory="256M" fork="yes" forkmode="perBatch"> + <jvmarg value="-Dhibernate.test.validatefailureexpected=${hibernate.test.validatefailureexpected}"/> <classpath> <fileset dir="${lib.dir}"> <include name="**/*.jar"/> @@ -561,6 +564,7 @@ <mkdir dir="${instrumenttest.out.dir}"/> <junit printsummary="yes" haltonfailure="yes" dir="${basedir}" maxmemory="256M" fork="yes" forkmode="perBatch"> + <jvmarg value="-Dhibernate.test.validatefailureexpected=${hibernate.test.validatefailureexpected}"/> <classpath> <fileset dir="${lib.dir}"> <include name="**/*.jar"/> @@ -594,6 +598,7 @@ description="Run the performance tests"> <mkdir dir="${test.out.dir}"/> <junit printsummary="yes" fork="yes" haltonfailure="yes" dir="${basedir}"> + <jvmarg value="-Dhibernate.test.validatefailureexpected=${hibernate.test.validatefailureexpected}"/> <classpath> <fileset dir="${lib.dir}"> <include name="**/*.jar"/> @@ -641,7 +646,8 @@ <target name="junitsingle" depends="cleantestdb,compiletest" description="Run a single test suite (requires testname and jdbc.driver properties)"> <mkdir dir="${test.out.dir}"/> - <junit printsummary="yes" fork="yes" haltonfailure="yes" dir="${basedir}"> + <junit printsummary="yes" maxmemory="256M" fork="yes" haltonfailure="yes" dir="${basedir}"> + <jvmarg value="-Dhibernate.test.validatefailureexpected=${hibernate.test.validatefailureexpected}"/> <classpath> <pathelement path="${etc.dir}"/> <!-- pick up property resources from the 'etc' directory first --> <fileset dir="${lib.dir}"> |
From: <hib...@li...> - 2006-07-28 20:48:42
|
Author: max...@jb... Date: 2006-07-26 07:38:41 -0400 (Wed, 26 Jul 2006) New Revision: 10156 Modified: trunk/Hibernate3/test/org/hibernate/test/AllTests.java Log: update AllTests for 1941 Modified: trunk/Hibernate3/test/org/hibernate/test/AllTests.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/AllTests.java 2006-07-26 11:38:29 UTC (rev 10155) +++ trunk/Hibernate3/test/org/hibernate/test/AllTests.java 2006-07-26 11:38:41 UTC (rev 10156) @@ -82,6 +82,7 @@ import org.hibernate.test.mapelemformula.MapElementFormulaTest; import org.hibernate.test.mapping.PersistentClassVisitorTest; import org.hibernate.test.mapping.ValueVisitorTest; +import org.hibernate.test.mappingexception.MappingExceptionTest; import org.hibernate.test.mixed.MixedTest; import org.hibernate.test.naturalid.NaturalIdTest; import org.hibernate.test.ondelete.OnDeleteTest; @@ -270,6 +271,7 @@ suite.addTest( AuctionTest.suite() ); suite.addTest( AuctionTest2.suite() ); suite.addTest( PaginationTest.suite() ); + suite.addTest( MappingExceptionTest.suite() ); if ( InstrumentTest.isRunnable() ) { suite.addTest( InstrumentTest.suite() ); } |
From: <hib...@li...> - 2006-07-28 20:35:21
|
Author: ste...@jb... Date: 2006-07-26 13:10:17 -0400 (Wed, 26 Jul 2006) New Revision: 10170 Added: trunk/Hibernate3/test/org/hibernate/test/join/User.java Modified: trunk/Hibernate3/doc/reference/en/modules/persistent_classes.xml trunk/Hibernate3/src/org/hibernate/persister/entity/AbstractEntityPersister.java trunk/Hibernate3/test/org/hibernate/test/join/JoinTest.java trunk/Hibernate3/test/org/hibernate/test/join/Person.hbm.xml Log: HHH-1713 : via patch; doc changes regarding tuple package refactoring Modified: trunk/Hibernate3/doc/reference/en/modules/persistent_classes.xml =================================================================== --- trunk/Hibernate3/doc/reference/en/modules/persistent_classes.xml 2006-07-26 17:05:35 UTC (rev 10169) +++ trunk/Hibernate3/doc/reference/en/modules/persistent_classes.xml 2006-07-26 17:10:17 UTC (rev 10170) @@ -457,7 +457,7 @@ </sect1> - <sect1 id="persistent-classes-tuplizers" revision="0"> + <sect1 id="persistent-classes-tuplizers" revision="1"> <title>Tuplizers</title> <para> @@ -469,7 +469,7 @@ for the POJO entity mode, the correpsonding tuplizer knows how create the POJO through its constructor and how to access the POJO properties using the defined property accessors. There are two high-level types of Tuplizers, represented by the - <literal>org.hibernate.tuple.EntityTuplizer</literal> and <literal>org.hibernate.tuple.ComponentTuplizer</literal> + <literal>org.hibernate.tuple.entity.EntityTuplizer</literal> and <literal>org.hibernate.tuple.component.ComponentTuplizer</literal> interfaces. <literal>EntityTuplizer</literal>s are responsible for managing the above mentioned contracts in regards to entities, while <literal>ComponentTuplizer</literal>s do the same for components. @@ -504,7 +504,7 @@ public class CustomMapTuplizerImpl - extends org.hibernate.tuple.DynamicMapEntityTuplizer { + extends org.hibernate.tuple.entity.DynamicMapEntityTuplizer { // override the buildInstantiator() method to plug in our custom map... protected final Instantiator buildInstantiator( org.hibernate.mapping.PersistentClass mappingInfo) { Modified: trunk/Hibernate3/src/org/hibernate/persister/entity/AbstractEntityPersister.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/persister/entity/AbstractEntityPersister.java 2006-07-26 17:05:35 UTC (rev 10169) +++ trunk/Hibernate3/src/org/hibernate/persister/entity/AbstractEntityPersister.java 2006-07-26 17:10:17 UTC (rev 10170) @@ -1961,6 +1961,7 @@ final boolean hasDeferred = rootPersister.hasSequentialSelect(); PreparedStatement sequentialSelect = null; ResultSet sequentialResultSet = null; + boolean sequentialSelectEmpty = false; try { if ( hasDeferred ) { @@ -1970,7 +1971,30 @@ sequentialSelect = session.getBatcher().prepareSelectStatement( sql ); rootPersister.getIdentifierType().nullSafeSet( sequentialSelect, id, 1, session ); sequentialResultSet = sequentialSelect.executeQuery(); - sequentialResultSet.next(); + if ( !sequentialResultSet.next() ) { + // TODO: Deal with the "optional" attribute in the <join> mapping; + // this code assumes that optional defaults to "true" because it + // doesn't actually seem to work in the fetch="join" code + // + // Note that actual proper handling of optional-ality here is actually + // more involved than this patch assumes. Remember that we might have + // multiple <join/> mappings associated with a single entity. Really + // a couple of things need to happen to properly handle optional here: + // 1) First and foremost, when handling multiple <join/>s, we really + // should be using the entity root table as the driving table; + // another option here would be to choose some non-optional joined + // table to use as the driving table. In all likelihood, just using + // the root table is much simplier + // 2) Need to add the FK columns corresponding to each joined table + // to the generated select list; these would then be used when + // iterating the result set to determine whether all non-optional + // data is present + // My initial thoughts on the best way to deal with this would be + // to introduce a new SequentialSelect abstraction that actually gets + // generated in the persisters (ok, SingleTable...) and utilized here. + // It would encapsulated all this required optional-ality checking... + sequentialSelectEmpty = true; + } } } @@ -1988,11 +2012,14 @@ //decide which ResultSet to get the property value from: final boolean propertyIsDeferred = hasDeferred && rootPersister.isSubclassPropertyDeferred( propNames[i], propSubclassNames[i] ); - final ResultSet propertyResultSet = propertyIsDeferred ? sequentialResultSet : rs; - final String[] cols = propertyIsDeferred ? - propertyColumnAliases[i] : suffixedPropertyColumns[i]; - - values[i] = types[i].hydrate( propertyResultSet, cols, session, object ); + if ( propertyIsDeferred && sequentialSelectEmpty ) { + values[i] = null; + } + else { + final ResultSet propertyResultSet = propertyIsDeferred ? sequentialResultSet : rs; + final String[] cols = propertyIsDeferred ? propertyColumnAliases[i] : suffixedPropertyColumns[i]; + values[i] = types[i].hydrate( propertyResultSet, cols, session, object ); + } } else { values[i] = LazyPropertyInitializer.UNFETCHED_PROPERTY; Modified: trunk/Hibernate3/test/org/hibernate/test/join/JoinTest.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/join/JoinTest.java 2006-07-26 17:05:35 UTC (rev 10169) +++ trunk/Hibernate3/test/org/hibernate/test/join/JoinTest.java 2006-07-26 17:10:17 UTC (rev 10170) @@ -90,6 +90,39 @@ s.close(); } + public void testSequentialSelectsOptionalData() throws Exception { + Session s = openSession(); + Transaction t = s.beginTransaction(); + + User jesus = new User(); + jesus.setName("Jesus Olvera y Martinez"); + jesus.setSex('M'); + + s.save(jesus); + + assertEquals( s.createQuery("from java.io.Serializable").list().size(), 0 ); + + assertEquals( s.createQuery("from Person").list().size(), 1 ); + assertEquals( s.createQuery("from Person p where p.class is null").list().size(), 0 ); + assertEquals( s.createQuery("from Person p where p.class = User").list().size(), 1 ); + assertTrue(s.createQuery("from User u").list().size()==1); + s.clear(); + + // Remove the optional row from the join table and requery the User obj + s.connection().prepareStatement("delete from t_user").execute(); + s.clear(); + + jesus = (User) s.get( Person.class, new Long( jesus.getId() ) ); + s.clear(); + + // Cleanup the test data + s.delete(jesus); + + assertTrue( s.createQuery("from Person").list().isEmpty() ); + t.commit(); + s.close(); + } + protected String[] getMappings() { return new String[] { "join/Person.hbm.xml" }; Modified: trunk/Hibernate3/test/org/hibernate/test/join/Person.hbm.xml =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/join/Person.hbm.xml 2006-07-26 17:05:35 UTC (rev 10169) +++ trunk/Hibernate3/test/org/hibernate/test/join/Person.hbm.xml 2006-07-26 17:10:17 UTC (rev 10170) @@ -23,34 +23,20 @@ --> -<hibernate-mapping - package="org.hibernate.test.join" - default-access="field"> +<hibernate-mapping package="org.hibernate.test.join" default-access="field"> - <class name="Person" - table="person" - lazy="true" - discriminator-value="null"> + <class name="Person" table="person" lazy="true" discriminator-value="null"> - <id name="id" - column="person_id" - unsaved-value="0"> + <id name="id" column="person_id" unsaved-value="0"> <generator class="native"/> </id> - - <discriminator column="person_type" - type="string" - length="1" - not-null="false" - force="true"/> <!--unnecessary, in case we had other unknown discriminator values --> - - <property name="name" - not-null="true" - length="80"/> - <property name="sex" - not-null="true" - update="false"/> - + + <!-- force is unnecessary, in case we had other unknown discriminator values --> + <discriminator column="person_type" type="string" length="1" not-null="false" force="true"/> + + <property name="name" not-null="true" length="80"/> + <property name="sex" not-null="true" update="false"/> + <join table="address"> <key column="address_id"/> <property name="address"/> @@ -61,11 +47,8 @@ <subclass name="Employee" lazy="true" discriminator-value="E"> <join table="employee" fetch="select"> <key column="person_id"/> - <property name="title" - not-null="true" - length="20"/> - <property name="salary" - length="0"/> + <property name="title" not-null="true" length="20"/> + <property name="salary" length="0"/> <many-to-one name="manager"/> </join> </subclass> @@ -78,6 +61,17 @@ </join> </subclass> + <subclass name="User" lazy="true" discriminator-value="U"> + <join table="t_user" fetch="select" optional="true"> + <key column="person_id"/> + <property name="login" column="u_login"/> + </join> + <join table="t_silly" fetch="select" optional="true" > + <key column="person_id"/> + <property name="silly"/> + </join> + </subclass> + </class> Added: trunk/Hibernate3/test/org/hibernate/test/join/User.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/join/User.java 2006-07-26 17:05:35 UTC (rev 10169) +++ trunk/Hibernate3/test/org/hibernate/test/join/User.java 2006-07-26 17:10:17 UTC (rev 10170) @@ -0,0 +1,23 @@ +//$Id$ +package org.hibernate.test.join; + +/** + * @author Mike Dillon + */ +public class User extends Person { + private String login; + private String silly; + + /** + * @return Returns the login. + */ + public String getLogin() { + return login; + } + /** + * @param login The login to set. + */ + public void setLogin(String login) { + this.login = login; + } +} |
From: <hib...@li...> - 2006-07-28 20:17:57
|
Author: epbernard Date: 2006-07-28 16:17:50 -0400 (Fri, 28 Jul 2006) New Revision: 10181 Modified: branches/Branch_3_2/Hibernate3/src/org/hibernate/cfg/ResultSetMappingBinder.java branches/Branch_3_2/Hibernate3/src/org/hibernate/dialect/Dialect.java branches/Branch_3_2/Hibernate3/src/org/hibernate/persister/entity/AbstractEntityPersister.java Log: HHH-1958 add force to entity persister lock modes Modified: branches/Branch_3_2/Hibernate3/src/org/hibernate/cfg/ResultSetMappingBinder.java =================================================================== --- branches/Branch_3_2/Hibernate3/src/org/hibernate/cfg/ResultSetMappingBinder.java 2006-07-28 20:17:01 UTC (rev 10180) +++ branches/Branch_3_2/Hibernate3/src/org/hibernate/cfg/ResultSetMappingBinder.java 2006-07-28 20:17:50 UTC (rev 10181) @@ -353,12 +353,12 @@ else if ( "upgrade-nowait".equals( lockMode ) ) { return LockMode.UPGRADE_NOWAIT; } - else if ( "upgrade-nowait".equals( lockMode ) ) { - return LockMode.UPGRADE_NOWAIT; - } else if ( "write".equals( lockMode ) ) { return LockMode.WRITE; } + else if ( "force".equals( lockMode ) ) { + return LockMode.FORCE; + } else { throw new MappingException( "unknown lockmode" ); } Modified: branches/Branch_3_2/Hibernate3/src/org/hibernate/dialect/Dialect.java =================================================================== --- branches/Branch_3_2/Hibernate3/src/org/hibernate/dialect/Dialect.java 2006-07-28 20:17:01 UTC (rev 10180) +++ branches/Branch_3_2/Hibernate3/src/org/hibernate/dialect/Dialect.java 2006-07-28 20:17:50 UTC (rev 10181) @@ -999,6 +999,9 @@ else if ( lockMode==LockMode.UPGRADE_NOWAIT ) { return getForUpdateNowaitString(); } + else if ( lockMode==LockMode.FORCE ) { + return getForUpdateNowaitString(); + } else { return ""; } Modified: branches/Branch_3_2/Hibernate3/src/org/hibernate/persister/entity/AbstractEntityPersister.java =================================================================== --- branches/Branch_3_2/Hibernate3/src/org/hibernate/persister/entity/AbstractEntityPersister.java 2006-07-28 20:17:01 UTC (rev 10180) +++ branches/Branch_3_2/Hibernate3/src/org/hibernate/persister/entity/AbstractEntityPersister.java 2006-07-28 20:17:50 UTC (rev 10181) @@ -1267,6 +1267,7 @@ lockers.put( LockMode.READ, generateLocker( LockMode.READ ) ); lockers.put( LockMode.UPGRADE, generateLocker( LockMode.UPGRADE ) ); lockers.put( LockMode.UPGRADE_NOWAIT, generateLocker( LockMode.UPGRADE_NOWAIT ) ); + lockers.put( LockMode.FORCE, generateLocker( LockMode.FORCE ) ); } protected LockingStrategy generateLocker(LockMode lockMode) { @@ -2853,6 +2854,12 @@ readLoader : createEntityLoader( LockMode.UPGRADE_NOWAIT ) ); + loaders.put( + LockMode.FORCE, + disableForUpdate ? + readLoader : + createEntityLoader( LockMode.FORCE ) + ); loaders.put( "merge", |
From: <hib...@li...> - 2006-07-28 20:17:17
|
Author: epbernard Date: 2006-07-28 16:17:01 -0400 (Fri, 28 Jul 2006) New Revision: 10180 Modified: trunk/Hibernate3/src/org/hibernate/cfg/ResultSetMappingBinder.java trunk/Hibernate3/src/org/hibernate/dialect/Dialect.java trunk/Hibernate3/src/org/hibernate/persister/entity/AbstractEntityPersister.java Log: HHH-1958 add force to entity persister lock modes Modified: trunk/Hibernate3/src/org/hibernate/cfg/ResultSetMappingBinder.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/cfg/ResultSetMappingBinder.java 2006-07-28 07:34:40 UTC (rev 10179) +++ trunk/Hibernate3/src/org/hibernate/cfg/ResultSetMappingBinder.java 2006-07-28 20:17:01 UTC (rev 10180) @@ -353,12 +353,12 @@ else if ( "upgrade-nowait".equals( lockMode ) ) { return LockMode.UPGRADE_NOWAIT; } - else if ( "upgrade-nowait".equals( lockMode ) ) { - return LockMode.UPGRADE_NOWAIT; - } else if ( "write".equals( lockMode ) ) { return LockMode.WRITE; } + else if ( "force".equals( lockMode ) ) { + return LockMode.FORCE; + } else { throw new MappingException( "unknown lockmode" ); } Modified: trunk/Hibernate3/src/org/hibernate/dialect/Dialect.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/dialect/Dialect.java 2006-07-28 07:34:40 UTC (rev 10179) +++ trunk/Hibernate3/src/org/hibernate/dialect/Dialect.java 2006-07-28 20:17:01 UTC (rev 10180) @@ -999,6 +999,9 @@ else if ( lockMode==LockMode.UPGRADE_NOWAIT ) { return getForUpdateNowaitString(); } + else if ( lockMode==LockMode.FORCE ) { + return getForUpdateString(); + } else { return ""; } Modified: trunk/Hibernate3/src/org/hibernate/persister/entity/AbstractEntityPersister.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/persister/entity/AbstractEntityPersister.java 2006-07-28 07:34:40 UTC (rev 10179) +++ trunk/Hibernate3/src/org/hibernate/persister/entity/AbstractEntityPersister.java 2006-07-28 20:17:01 UTC (rev 10180) @@ -1267,6 +1267,7 @@ lockers.put( LockMode.READ, generateLocker( LockMode.READ ) ); lockers.put( LockMode.UPGRADE, generateLocker( LockMode.UPGRADE ) ); lockers.put( LockMode.UPGRADE_NOWAIT, generateLocker( LockMode.UPGRADE_NOWAIT ) ); + //lockers.put( LockMode.FORCE, generateLocker( LockMode.FORCE ) ); } protected LockingStrategy generateLocker(LockMode lockMode) { @@ -2853,6 +2854,12 @@ readLoader : createEntityLoader( LockMode.UPGRADE_NOWAIT ) ); + loaders.put( + LockMode.FORCE, + disableForUpdate ? + readLoader : + createEntityLoader( LockMode.FORCE ) + ); loaders.put( "merge", |
From: <hib...@li...> - 2006-07-28 19:32:19
|
Author: ste...@jb... Date: 2006-07-26 13:04:14 -0400 (Wed, 26 Jul 2006) New Revision: 10168 Added: trunk/Hibernate3/test/org/hibernate/test/util/UtilSuite.java Modified: trunk/Hibernate3/test/org/hibernate/test/util/PropertiesHelperTest.java trunk/Hibernate3/test/org/hibernate/test/util/dtd/EntityResolverTest.java Log: proper util suite Modified: trunk/Hibernate3/test/org/hibernate/test/util/PropertiesHelperTest.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/util/PropertiesHelperTest.java 2006-07-26 17:00:46 UTC (rev 10167) +++ trunk/Hibernate3/test/org/hibernate/test/util/PropertiesHelperTest.java 2006-07-26 17:04:14 UTC (rev 10168) @@ -1,6 +1,8 @@ package org.hibernate.test.util; import junit.framework.TestCase; +import junit.framework.Test; +import junit.framework.TestSuite; import java.util.Properties; import java.util.Iterator; @@ -101,4 +103,8 @@ catch( NumberFormatException expected ) { } } + + public static Test suite() { + return new TestSuite( PropertiesHelperTest.class ); + } } Added: trunk/Hibernate3/test/org/hibernate/test/util/UtilSuite.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/util/UtilSuite.java 2006-07-26 17:00:46 UTC (rev 10167) +++ trunk/Hibernate3/test/org/hibernate/test/util/UtilSuite.java 2006-07-26 17:04:14 UTC (rev 10168) @@ -0,0 +1,19 @@ +package org.hibernate.test.util; + +import junit.framework.Test; +import junit.framework.TestSuite; +import org.hibernate.test.util.dtd.EntityResolverTest; + +/** + * todo: describe UtilSuite + * + * @author Steve Ebersole + */ +public class UtilSuite { + public static Test suite() { + TestSuite suite = new TestSuite( "Utility package tests" ); + suite.addTest( PropertiesHelperTest.suite() ); + suite.addTest( EntityResolverTest.suite() ); + return suite; + } +} Modified: trunk/Hibernate3/test/org/hibernate/test/util/dtd/EntityResolverTest.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/util/dtd/EntityResolverTest.java 2006-07-26 17:00:46 UTC (rev 10167) +++ trunk/Hibernate3/test/org/hibernate/test/util/dtd/EntityResolverTest.java 2006-07-26 17:04:14 UTC (rev 10168) @@ -1,6 +1,8 @@ package org.hibernate.test.util.dtd; import junit.framework.TestCase; +import junit.framework.Test; +import junit.framework.TestSuite; import org.hibernate.cfg.Configuration; @@ -19,4 +21,8 @@ cfg.addResource( "org/hibernate/test/util/dtd/Parent.hbm.xml" ); cfg.buildMappings(); } + + public static Test suite() { + return new TestSuite( EntityResolverTest.class ); + } } |
From: <hib...@li...> - 2006-07-28 19:16:00
|
Author: max...@jb... Date: 2006-07-26 11:13:29 -0400 (Wed, 26 Jul 2006) New Revision: 10166 Modified: trunk/HibernateExt/tools/src/templates/hbm/set.hbm.ftl trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/ManyToManyTest.java Log: many-to-many to hbm.xml Modified: trunk/HibernateExt/tools/src/templates/hbm/set.hbm.ftl =================================================================== --- trunk/HibernateExt/tools/src/templates/hbm/set.hbm.ftl 2006-07-26 15:12:52 UTC (rev 10165) +++ trunk/HibernateExt/tools/src/templates/hbm/set.hbm.ftl 2006-07-26 15:13:29 UTC (rev 10166) @@ -16,7 +16,7 @@ /> <#elseif c2h.isManyToMany(property)> <many-to-many - entity-name="$c2h.getClassName($property.getValue().getElement())"> <#-- lookup needed classname --> + entity-name="${property.getValue().getElement().getReferencedEntityName()}"> <#-- lookup needed classname --> <#foreach column in property.getValue().getElement().columnIterator> <#include "column.hbm.ftl"> </#foreach> Modified: trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/ManyToManyTest.java =================================================================== --- trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/ManyToManyTest.java 2006-07-26 15:12:52 UTC (rev 10165) +++ trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/ManyToManyTest.java 2006-07-26 15:13:29 UTC (rev 10166) @@ -64,7 +64,7 @@ } - public void testManyToManyFailureExpected() throws DocumentException { + public void testManyToMany() throws DocumentException { File outputXml = new File(getOutputDir(), getBaseForMappings() + "User.hbm.xml"); assertFileAndExists(outputXml); @@ -76,7 +76,7 @@ List list = xpath.selectNodes(document); assertEquals("Expected to get one many-to-many element", 1, list.size()); Element node = (Element) list.get(0); - assertEquals(node.attribute( "class" ).getText(),"Group"); + assertEquals(node.attribute( "entity-name" ).getText(),"org.hibernate.tool.hbm2x.hbm2hbmxml.Group"); } |
From: Jose H. V. M. <jmu...@gm...> - 2006-07-28 18:54:09
|
I would like to unsuscripte to the mail list, and just check information on the web saite Thanks for advanced. |
From: <hib...@li...> - 2006-07-28 10:05:51
|
Author: ste...@jb... Date: 2006-07-26 13:16:46 -0400 (Wed, 26 Jul 2006) New Revision: 10171 Added: branches/Branch_3_2/Hibernate3/test/org/hibernate/test/join/User.java Modified: branches/Branch_3_2/Hibernate3/src/org/hibernate/persister/entity/AbstractEntityPersister.java branches/Branch_3_2/Hibernate3/test/org/hibernate/test/join/JoinTest.java branches/Branch_3_2/Hibernate3/test/org/hibernate/test/join/Person.hbm.xml Log: ported fix for HHH-1713 to 3.2 branch Modified: branches/Branch_3_2/Hibernate3/src/org/hibernate/persister/entity/AbstractEntityPersister.java =================================================================== --- branches/Branch_3_2/Hibernate3/src/org/hibernate/persister/entity/AbstractEntityPersister.java 2006-07-26 17:10:17 UTC (rev 10170) +++ branches/Branch_3_2/Hibernate3/src/org/hibernate/persister/entity/AbstractEntityPersister.java 2006-07-26 17:16:46 UTC (rev 10171) @@ -1961,6 +1961,7 @@ final boolean hasDeferred = rootPersister.hasSequentialSelect(); PreparedStatement sequentialSelect = null; ResultSet sequentialResultSet = null; + boolean sequentialSelectEmpty = false; try { if ( hasDeferred ) { @@ -1970,7 +1971,30 @@ sequentialSelect = session.getBatcher().prepareSelectStatement( sql ); rootPersister.getIdentifierType().nullSafeSet( sequentialSelect, id, 1, session ); sequentialResultSet = sequentialSelect.executeQuery(); - sequentialResultSet.next(); + if ( !sequentialResultSet.next() ) { + // TODO: Deal with the "optional" attribute in the <join> mapping; + // this code assumes that optional defaults to "true" because it + // doesn't actually seem to work in the fetch="join" code + // + // Note that actual proper handling of optional-ality here is actually + // more involved than this patch assumes. Remember that we might have + // multiple <join/> mappings associated with a single entity. Really + // a couple of things need to happen to properly handle optional here: + // 1) First and foremost, when handling multiple <join/>s, we really + // should be using the entity root table as the driving table; + // another option here would be to choose some non-optional joined + // table to use as the driving table. In all likelihood, just using + // the root table is much simplier + // 2) Need to add the FK columns corresponding to each joined table + // to the generated select list; these would then be used when + // iterating the result set to determine whether all non-optional + // data is present + // My initial thoughts on the best way to deal with this would be + // to introduce a new SequentialSelect abstraction that actually gets + // generated in the persisters (ok, SingleTable...) and utilized here. + // It would encapsulated all this required optional-ality checking... + sequentialSelectEmpty = true; + } } } @@ -1988,11 +2012,14 @@ //decide which ResultSet to get the property value from: final boolean propertyIsDeferred = hasDeferred && rootPersister.isSubclassPropertyDeferred( propNames[i], propSubclassNames[i] ); - final ResultSet propertyResultSet = propertyIsDeferred ? sequentialResultSet : rs; - final String[] cols = propertyIsDeferred ? - propertyColumnAliases[i] : suffixedPropertyColumns[i]; - - values[i] = types[i].hydrate( propertyResultSet, cols, session, object ); + if ( propertyIsDeferred && sequentialSelectEmpty ) { + values[i] = null; + } + else { + final ResultSet propertyResultSet = propertyIsDeferred ? sequentialResultSet : rs; + final String[] cols = propertyIsDeferred ? propertyColumnAliases[i] : suffixedPropertyColumns[i]; + values[i] = types[i].hydrate( propertyResultSet, cols, session, object ); + } } else { values[i] = LazyPropertyInitializer.UNFETCHED_PROPERTY; Modified: branches/Branch_3_2/Hibernate3/test/org/hibernate/test/join/JoinTest.java =================================================================== --- branches/Branch_3_2/Hibernate3/test/org/hibernate/test/join/JoinTest.java 2006-07-26 17:10:17 UTC (rev 10170) +++ branches/Branch_3_2/Hibernate3/test/org/hibernate/test/join/JoinTest.java 2006-07-26 17:16:46 UTC (rev 10171) @@ -90,6 +90,39 @@ s.close(); } + public void testSequentialSelectsOptionalData() throws Exception { + Session s = openSession(); + Transaction t = s.beginTransaction(); + + User jesus = new User(); + jesus.setName("Jesus Olvera y Martinez"); + jesus.setSex('M'); + + s.save(jesus); + + assertEquals( s.createQuery("from java.io.Serializable").list().size(), 0 ); + + assertEquals( s.createQuery("from Person").list().size(), 1 ); + assertEquals( s.createQuery("from Person p where p.class is null").list().size(), 0 ); + assertEquals( s.createQuery("from Person p where p.class = User").list().size(), 1 ); + assertTrue(s.createQuery("from User u").list().size()==1); + s.clear(); + + // Remove the optional row from the join table and requery the User obj + s.connection().prepareStatement("delete from t_user").execute(); + s.clear(); + + jesus = (User) s.get( Person.class, new Long( jesus.getId() ) ); + s.clear(); + + // Cleanup the test data + s.delete(jesus); + + assertTrue( s.createQuery("from Person").list().isEmpty() ); + t.commit(); + s.close(); + } + protected String[] getMappings() { return new String[] { "join/Person.hbm.xml" }; Modified: branches/Branch_3_2/Hibernate3/test/org/hibernate/test/join/Person.hbm.xml =================================================================== --- branches/Branch_3_2/Hibernate3/test/org/hibernate/test/join/Person.hbm.xml 2006-07-26 17:10:17 UTC (rev 10170) +++ branches/Branch_3_2/Hibernate3/test/org/hibernate/test/join/Person.hbm.xml 2006-07-26 17:16:46 UTC (rev 10171) @@ -23,53 +23,36 @@ --> -<hibernate-mapping - package="org.hibernate.test.join" - default-access="field"> - - <class name="Person" - table="person" - lazy="true" - discriminator-value="null"> - - <id name="id" - column="person_id" - unsaved-value="0"> +<hibernate-mapping package="org.hibernate.test.join" default-access="field"> + + <class name="Person" table="person" lazy="true" discriminator-value="null"> + + <id name="id" column="person_id" unsaved-value="0"> <generator class="native"/> </id> - - <discriminator column="person_type" - type="string" - length="1" - not-null="false" - force="true"/> <!--unnecessary, in case we had other unknown discriminator values --> - - <property name="name" - not-null="true" - length="80"/> - <property name="sex" - not-null="true" - update="false"/> - + + <!-- force is unnecessary, in case we had other unknown discriminator values --> + <discriminator column="person_type" type="string" length="1" not-null="false" force="true"/> + + <property name="name" not-null="true" length="80"/> + <property name="sex" not-null="true" update="false"/> + <join table="address"> <key column="address_id"/> <property name="address"/> <property name="zip"/> <property name="country"/> </join> - + <subclass name="Employee" lazy="true" discriminator-value="E"> <join table="employee" fetch="select"> <key column="person_id"/> - <property name="title" - not-null="true" - length="20"/> - <property name="salary" - length="0"/> + <property name="title" not-null="true" length="20"/> + <property name="salary" length="0"/> <many-to-one name="manager"/> </join> </subclass> - + <subclass name="Customer" lazy="true" discriminator-value="C"> <join table="customer" fetch="select"> <key column="person_id"/> @@ -77,8 +60,19 @@ <many-to-one name="salesperson"/> </join> </subclass> - + + <subclass name="User" lazy="true" discriminator-value="U"> + <join table="t_user" fetch="select" optional="true"> + <key column="person_id"/> + <property name="login" column="u_login"/> + </join> + <join table="t_silly" fetch="select" optional="true" > + <key column="person_id"/> + <property name="silly"/> + </join> + </subclass> + </class> - + </hibernate-mapping> Added: branches/Branch_3_2/Hibernate3/test/org/hibernate/test/join/User.java =================================================================== --- branches/Branch_3_2/Hibernate3/test/org/hibernate/test/join/User.java 2006-07-26 17:10:17 UTC (rev 10170) +++ branches/Branch_3_2/Hibernate3/test/org/hibernate/test/join/User.java 2006-07-26 17:16:46 UTC (rev 10171) @@ -0,0 +1,23 @@ +//$Id$ +package org.hibernate.test.join; + +/** + * @author Mike Dillon + */ +public class User extends Person { + private String login; + private String silly; + + /** + * @return Returns the login. + */ + public String getLogin() { + return login; + } + /** + * @param login The login to set. + */ + public void setLogin(String login) { + this.login = login; + } +} |
From: <hib...@li...> - 2006-07-28 06:55:01
|
Author: epbernard Date: 2006-07-25 17:37:08 -0400 (Tue, 25 Jul 2006) New Revision: 10150 Modified: trunk/Hibernate3/src/org/hibernate/engine/CascadingAction.java Log: HHH-1943 Modified: trunk/Hibernate3/src/org/hibernate/engine/CascadingAction.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/engine/CascadingAction.java 2006-07-25 17:08:43 UTC (rev 10149) +++ trunk/Hibernate3/src/org/hibernate/engine/CascadingAction.java 2006-07-25 21:37:08 UTC (rev 10150) @@ -267,7 +267,8 @@ Type type = persister.getPropertyTypes()[propertyIndex]; if ( type.isEntityType() ) { String childEntityName = ( ( EntityType ) type ).getAssociatedEntityName( session.getFactory() ); - if ( ForeignKeys.isTransient( childEntityName, child, null, session ) ) { + + if ( ! isInManagedState( child, session ) && ForeignKeys.isTransient( childEntityName, child, null, session ) ) { String parentEntiytName = persister.getEntityName(); String propertyName = persister.getPropertyNames()[propertyIndex]; throw new TransientObjectException( @@ -280,6 +281,11 @@ } } + private boolean isInManagedState(Object child, EventSource session) { + EntityEntry entry = session.getPersistenceContext().getEntry( child ); + return entry != null && (entry.getStatus() == Status.MANAGED || entry.getStatus() == Status.READ_ONLY); + } + public String toString() { return "ACTION_PERSIST_ON_FLUSH"; } |
From: <hib...@li...> - 2006-07-28 03:05:01
|
Author: ste...@jb... Date: 2006-07-26 14:01:49 -0400 (Wed, 26 Jul 2006) New Revision: 10172 Modified: trunk/Hibernate3/src/org/hibernate/hql/ast/tree/FromClause.java trunk/Hibernate3/test/org/hibernate/test/hql/EJBQLTest.java trunk/Hibernate3/test/org/hibernate/test/jpa/ql/JPAQLComplianceTest.java Log: HHH-1948 : (JPA) from-element alias references need to be case insensitive Modified: trunk/Hibernate3/src/org/hibernate/hql/ast/tree/FromClause.java =================================================================== --- trunk/Hibernate3/src/org/hibernate/hql/ast/tree/FromClause.java 2006-07-26 17:16:46 UTC (rev 10171) +++ trunk/Hibernate3/src/org/hibernate/hql/ast/tree/FromClause.java 2006-07-26 18:01:49 UTC (rev 10172) @@ -103,12 +103,27 @@ */ public FromElement getFromElement(String aliasOrClassName) { FromElement fromElement = ( FromElement ) fromElementByClassAlias.get( aliasOrClassName ); + if ( fromElement == null && getSessionFactoryHelper().isStrictJPAQLComplianceEnabled() ) { + fromElement = findIntendedAliasedFromElementBasedOnCrazyJPARequirements( aliasOrClassName ); + } if ( fromElement == null && parentFromClause != null ) { fromElement = parentFromClause.getFromElement( aliasOrClassName ); } return fromElement; } + private FromElement findIntendedAliasedFromElementBasedOnCrazyJPARequirements(String specifiedAlias) { + Iterator itr = fromElementByClassAlias.entrySet().iterator(); + while ( itr.hasNext() ) { + Map.Entry entry = ( Map.Entry ) itr.next(); + String alias = ( String ) entry.getKey(); + if ( alias.equalsIgnoreCase( specifiedAlias ) ) { + return ( FromElement ) entry.getValue(); + } + } + return null; + } + /** * Convenience method to check whether a given token represents a from-element alias. * @@ -117,7 +132,7 @@ * from this point in the query graph. */ public boolean isFromElementAlias(String possibleAlias) { - boolean isAlias = fromElementByClassAlias.containsKey( possibleAlias ); + boolean isAlias = containsClassAlias( possibleAlias ); if ( !isAlias && parentFromClause != null ) { // try the parent FromClause... isAlias = parentFromClause.isFromElementAlias( possibleAlias ); @@ -227,7 +242,11 @@ * @return true if the from node contains the class alias name. */ public boolean containsClassAlias(String alias) { - return fromElementByClassAlias.keySet().contains( alias ); + boolean isAlias = fromElementByClassAlias.containsKey( alias ); + if ( !isAlias && getSessionFactoryHelper().isStrictJPAQLComplianceEnabled() ) { + isAlias = findIntendedAliasedFromElementBasedOnCrazyJPARequirements( alias ) != null; + } + return isAlias; } /** Modified: trunk/Hibernate3/test/org/hibernate/test/hql/EJBQLTest.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/hql/EJBQLTest.java 2006-07-26 17:16:46 UTC (rev 10171) +++ trunk/Hibernate3/test/org/hibernate/test/hql/EJBQLTest.java 2006-07-26 18:01:49 UTC (rev 10172) @@ -80,7 +80,7 @@ //parse(hql); //parse(ejbql); assertEjbqlEqualsHql(ejbql, hql); - + hql = "from Animal a where exists (from a.mother.father.offspring)"; ejbql = "select object(a) from Animal a where a.mother.father.offspring is not empty"; assertEjbqlEqualsHql( ejbql, hql ); @@ -218,11 +218,7 @@ assertEjbqlEqualsHql( "from Human h where not(h.pregnant is true)", "from Human h where not( h.pregnant=true )" ); } - public void testIdentifierCaseSensitive() throws Exception { - Session s = openSession( ); - s.createQuery( "select object(H) from Human h").list(); - s.close(); - } + // Private private void assertEjbqlEqualsHql(String ejbql, String hql) { Modified: trunk/Hibernate3/test/org/hibernate/test/jpa/ql/JPAQLComplianceTest.java =================================================================== --- trunk/Hibernate3/test/org/hibernate/test/jpa/ql/JPAQLComplianceTest.java 2006-07-26 17:16:46 UTC (rev 10171) +++ trunk/Hibernate3/test/org/hibernate/test/jpa/ql/JPAQLComplianceTest.java 2006-07-26 18:01:49 UTC (rev 10172) @@ -19,6 +19,7 @@ public static Test suite() { return new TestSuite( JPAQLComplianceTest.class ); } + public void testAliasNameSameAsUnqualifiedEntityName() { Session s = openSession(); s.beginTransaction(); @@ -40,6 +41,12 @@ s.close(); } + public void testIdentifierCaseSensitive() throws Exception { + Session s = openSession( ); + s.createQuery( "select object(I) from Item i").list(); + s.close(); + } + public void testSelectWithDistinctClause() { Session s = openSession(); s.createQuery( "select c FROM Item c WHERE c.parts IS EMPTY" ).list(); |
From: <hib...@li...> - 2006-07-28 01:59:20
|
Author: ste...@jb... Date: 2006-07-26 11:07:50 -0400 (Wed, 26 Jul 2006) New Revision: 10163 Modified: trunk/Hibernate3/grammar/hql.g Log: HHH-1947 : (JPA) MEMBER OF operation : OF keyword is optional Modified: trunk/Hibernate3/grammar/hql.g =================================================================== --- trunk/Hibernate3/grammar/hql.g 2006-07-26 15:05:23 UTC (rev 10162) +++ trunk/Hibernate3/grammar/hql.g 2006-07-26 15:07:50 UTC (rev 10163) @@ -521,7 +521,7 @@ #l.setText( (n == null) ? "like" : "not like"); } concatenation likeEscape) - | (MEMBER! OF! p:path! { + | (MEMBER! (OF!)? p:path! { processMemberOf(n,#p,currentAST); } ) ) ) |