Hibernate SVN: r10550 - trunk/HibernateExt/tools/lib
by hibernate-commits@lists.jboss.org
Author: max.andersen(a)jboss.com
Date: 2006-10-03 20:11:49 -0400 (Tue, 03 Oct 2006)
New Revision: 10550
Added:
trunk/HibernateExt/tools/lib/jtidy-r8-20060801.jar
Removed:
trunk/HibernateExt/tools/lib/jtidy-r8-21122004.jar
Log:
upgrade jtidy
Added: trunk/HibernateExt/tools/lib/jtidy-r8-20060801.jar
===================================================================
(Binary files differ)
Property changes on: trunk/HibernateExt/tools/lib/jtidy-r8-20060801.jar
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Deleted: trunk/HibernateExt/tools/lib/jtidy-r8-21122004.jar
===================================================================
(Binary files differ)
17 years, 6 months
Hibernate SVN: r10549 - in trunk/HibernateExt/tools/src/test/org/hibernate/tool: . hbm2x hbm2x/hbm2hbmxml stat test test/jdbc2cfg
by hibernate-commits@lists.jboss.org
Author: max.andersen(a)jboss.com
Date: 2006-10-03 20:11:08 -0400 (Tue, 03 Oct 2006)
New Revision: 10549
Modified:
trunk/HibernateExt/tools/src/test/org/hibernate/tool/NonReflectiveTestCase.java
trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/DocExporterTest.java
trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/XMLPrettyPrinterTest.java
trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/Basic.hbm.xml
trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/Hbm2HbmXmlTest.java
trunk/HibernateExt/tools/src/test/org/hibernate/tool/stat/StatisticsBrowserTest.java
trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/TestHelper.java
trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/OverrideBinderTest.java
trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/PersistentClassesTest.java
Log:
tests for graph generation in hbm2doc and meta attributes in hbm2hbmxml
Modified: trunk/HibernateExt/tools/src/test/org/hibernate/tool/NonReflectiveTestCase.java
===================================================================
--- trunk/HibernateExt/tools/src/test/org/hibernate/tool/NonReflectiveTestCase.java 2006-10-03 23:52:56 UTC (rev 10548)
+++ trunk/HibernateExt/tools/src/test/org/hibernate/tool/NonReflectiveTestCase.java 2006-10-04 00:11:08 UTC (rev 10549)
@@ -183,4 +183,8 @@
public Configuration getConfiguration() {
return getCfg();
}
+
+ protected void buildSessionFactory() {
+ sessions = getCfg().buildSessionFactory();
+ }
}
Modified: trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/DocExporterTest.java
===================================================================
--- trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/DocExporterTest.java 2006-10-03 23:52:56 UTC (rev 10548)
+++ trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/DocExporterTest.java 2006-10-04 00:11:08 UTC (rev 10549)
@@ -1,6 +1,7 @@
package org.hibernate.tool.hbm2x;
import java.io.File;
+import java.util.Properties;
import org.hibernate.tool.NonReflectiveTestCase;
@@ -28,9 +29,15 @@
protected void setUp() throws Exception {
super.setUp();
DocExporter exporter = new DocExporter(getCfg(), getOutputDir() );
+ Properties properties = new Properties();
+ properties.put("dot.executable", System.getProperties().getProperty("dot.executable","dot.exe"));
+ exporter.setProperties( properties );
exporter.start();
}
+ protected void tearDown() throws Exception {
+ //super.tearDown();
+ }
public void testExporter() {
assertFileAndExists(new File(getOutputDir(), "header.html") );
@@ -48,6 +55,12 @@
assertTrue(new File(getOutputDir(), "entities/org/hibernate/tool/hbm2x/UPerson.html").exists() );
assertFileAndExists(new File(getOutputDir(), "entities/org/hibernate/tool/hbm2x/UUser.html") );
+ assertFileAndExists(new File(getOutputDir(), "entities/entitygraph.dot"));
+ assertFileAndExists(new File(getOutputDir(), "entities/entitygraph.png"));
+
+ assertFileAndExists(new File(getOutputDir(), "tables/tablegraph.dot"));
+ assertFileAndExists(new File(getOutputDir(), "tables/tablegraph.png"));
+
}
Modified: trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/XMLPrettyPrinterTest.java
===================================================================
--- trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/XMLPrettyPrinterTest.java 2006-10-03 23:52:56 UTC (rev 10548)
+++ trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/XMLPrettyPrinterTest.java 2006-10-04 00:11:08 UTC (rev 10549)
@@ -35,7 +35,17 @@
assertEquals("<basic attrib='1'></basic>\r\n",string);
}
-
+
+ public void testCloseTag() throws IOException, DocumentException, SAXException {
+
+ ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+ XMLPrettyPrinter.prettyPrint(new ByteArrayInputStream("<basic></basic>".getBytes() ), byteArrayOutputStream);
+
+ String string = byteArrayOutputStream.toString();
+
+ assertEquals("<basic/>\r\n",string);
+ }
+
public void testDeclarationWithoutValidation() throws IOException, DocumentException, SAXException {
String input = "<hibernate-mapping defaultx-lazy=\"false\"/>";
Modified: trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/Basic.hbm.xml
===================================================================
--- trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/Basic.hbm.xml 2006-10-03 23:52:56 UTC (rev 10548)
+++ trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/Basic.hbm.xml 2006-10-04 00:11:08 UTC (rev 10549)
@@ -11,12 +11,14 @@
(2) Id generation with no arguments.
-->
<class name="Basic" table="`bas-ic`">
-
+ <meta attribute="class-meta" inherit="false">Basic</meta>
+ <meta attribute="class-meta" inherit="false">Basic2</meta>
<id name="basicId"
length="10"
type="string"
unsaved-value="null"
>
+ <meta attribute="id-meta" inherit="false">basicId</meta>
<generator class="org.hibernate.id.TableHiLoGenerator">
<param name="table">uni_table</param>
<param name="column">next_hi_value</param>
@@ -26,12 +28,20 @@
<property name="description"
not-null="true"
length="200"
- type="string" />
+ type="string">
+ <meta attribute="property-desc" inherit="false">description</meta>
+ </property>
<property name="price" length="3" type="big_decimal" />
<property name="numberAvailable" type="int" column="`number-Available`"/>
+ <set name="aSet">
+ <meta attribute="set-desc">anotherone</meta>
+ <key/>
+ <one-to-many class="Basic"/>
+ </set>
+
</class>
</hibernate-mapping>
Modified: trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/Hbm2HbmXmlTest.java
===================================================================
--- trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/Hbm2HbmXmlTest.java 2006-10-03 23:52:56 UTC (rev 10548)
+++ trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/Hbm2HbmXmlTest.java 2006-10-04 00:11:08 UTC (rev 10549)
@@ -127,6 +127,36 @@
}
+ public void testMetaAttributes() throws DocumentException {
+ File outputXml = new File(getOutputDir().getAbsolutePath() + "/org/hibernate/tool/hbm2x/hbm2hbmxml/Basic.hbm.xml");
+ assertFileAndExists(outputXml);
+
+ SAXReader xmlReader = this.getSAXReader();
+
+ Document document = xmlReader.read(outputXml);
+
+ XPath xpath = DocumentHelper.createXPath("//hibernate-mapping/class/meta");
+ List list = xpath.selectNodes(document);
+ assertEquals("Expected to get one meta element", 2, list.size());
+ Node node = (Node) list.get(0);
+ assertEquals(node.getText(),"Basic");
+
+ xpath = DocumentHelper.createXPath("//hibernate-mapping/class/property/meta");
+ list = xpath.selectNodes(document);
+ assertEquals("Expected to get one meta element", 1, list.size());
+ node = (Node) list.get(0);
+ assertEquals(node.getText(),"description");
+
+ xpath = DocumentHelper.createXPath("//hibernate-mapping/class/set/meta");
+ list = xpath.selectNodes(document);
+ assertEquals("Expected to get one meta element", 1, list.size());
+ node = (Node) list.get(0);
+ assertEquals(node.getText(),"anotherone");
+
+
+ }
+
+
public void testComments() throws DocumentException {
File outputXml = new File(getOutputDir().getAbsolutePath() + "/org/hibernate/tool/hbm2x/hbm2hbmxml/ClassFullAttribute.hbm.xml");
assertFileAndExists(outputXml);
Modified: trunk/HibernateExt/tools/src/test/org/hibernate/tool/stat/StatisticsBrowserTest.java
===================================================================
--- trunk/HibernateExt/tools/src/test/org/hibernate/tool/stat/StatisticsBrowserTest.java 2006-10-03 23:52:56 UTC (rev 10548)
+++ trunk/HibernateExt/tools/src/test/org/hibernate/tool/stat/StatisticsBrowserTest.java 2006-10-04 00:11:08 UTC (rev 10549)
@@ -15,9 +15,19 @@
cfg.setProperty( Environment.USE_STRUCTURED_CACHE, "true" );
}*/
+ protected void setUp() throws Exception {
+ // TODO Auto-generated method stub
+ super.setUp();
+ if(getSessions()==null) {
+ buildSessionFactory();
+ }
+ }
public void testBrowser() throws Exception {
getSessions().getStatistics().setStatisticsEnabled( true );
+
new StatisticsBrowser().showStatistics( getSessions().getStatistics(), false );
+
+
Session s = openSession();
Transaction tx = s.beginTransaction();
Modified: trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/TestHelper.java
===================================================================
--- trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/TestHelper.java 2006-10-03 23:52:56 UTC (rev 10548)
+++ trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/TestHelper.java 2006-10-04 00:11:08 UTC (rev 10549)
@@ -164,6 +164,7 @@
}
// The directory is now empty so delete it
+ System.out.println("deleting: " + dir);
return dir.delete();
}
Modified: trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/OverrideBinderTest.java
===================================================================
--- trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/OverrideBinderTest.java 2006-10-03 23:52:56 UTC (rev 10548)
+++ trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/OverrideBinderTest.java 2006-10-04 00:11:08 UTC (rev 10549)
@@ -4,6 +4,7 @@
*/
package org.hibernate.tool.test.jdbc2cfg;
+import java.io.File;
import java.sql.Types;
import java.util.Iterator;
import java.util.List;
@@ -12,6 +13,7 @@
import junit.framework.Test;
import junit.framework.TestSuite;
+import org.hibernate.cfg.Configuration;
import org.hibernate.cfg.Environment;
import org.hibernate.cfg.JDBCMetaDataConfiguration;
import org.hibernate.cfg.Settings;
@@ -32,6 +34,7 @@
import org.hibernate.mapping.SimpleValue;
import org.hibernate.mapping.Table;
import org.hibernate.tool.JDBCMetaDataBinderTestCase;
+import org.hibernate.tool.hbm2x.HibernateMappingExporter;
/**
* @author max
@@ -489,6 +492,7 @@
return ( (SimpleValue)property.getValue() ).getTypeName();
}
+
protected String[] getCreateSQL() {
Modified: trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/PersistentClassesTest.java
===================================================================
--- trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/PersistentClassesTest.java 2006-10-03 23:52:56 UTC (rev 10548)
+++ trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/PersistentClassesTest.java 2006-10-04 00:11:08 UTC (rev 10549)
@@ -24,6 +24,7 @@
import org.hibernate.mapping.Property;
import org.hibernate.mapping.Set;
import org.hibernate.tool.JDBCMetaDataBinderTestCase;
+import org.hibernate.tool.stat.StatisticsBrowser;
import persistentclasses.Item;
import persistentclasses.Orders;
@@ -116,6 +117,8 @@
SessionFactory sf = cfg.buildSessionFactory();
+
+
Session session = sf.openSession();
Transaction t = session.beginTransaction();
@@ -135,6 +138,7 @@
t.commit();
session.close();
+ new StatisticsBrowser().showStatistics( sf.getStatistics(), true );
session = sf.openSession();
t = session.beginTransaction();
17 years, 6 months
Hibernate SVN: r10548 - trunk/HibernateExt/tools/src/templates/hbm
by hibernate-commits@lists.jboss.org
Author: max.andersen(a)jboss.com
Date: 2006-10-03 19:52:56 -0400 (Tue, 03 Oct 2006)
New Revision: 10548
Added:
trunk/HibernateExt/tools/src/templates/hbm/meta.hbm.ftl
Modified:
trunk/HibernateExt/tools/src/templates/hbm/array.hbm.ftl
trunk/HibernateExt/tools/src/templates/hbm/bag.hbm.ftl
trunk/HibernateExt/tools/src/templates/hbm/component.hbm.ftl
trunk/HibernateExt/tools/src/templates/hbm/id.hbm.ftl
trunk/HibernateExt/tools/src/templates/hbm/list.hbm.ftl
trunk/HibernateExt/tools/src/templates/hbm/many-to-one.hbm.ftl
trunk/HibernateExt/tools/src/templates/hbm/persistentclass.hbm.ftl
trunk/HibernateExt/tools/src/templates/hbm/primitive-array.hbm.ftl
trunk/HibernateExt/tools/src/templates/hbm/property.hbm.ftl
trunk/HibernateExt/tools/src/templates/hbm/set.hbm.ftl
trunk/HibernateExt/tools/src/templates/hbm/timestamp.hbm.ftl
trunk/HibernateExt/tools/src/templates/hbm/version.hbm.ftl
Log:
HBX-767 generate meta in hbm2hbmxml
Modified: trunk/HibernateExt/tools/src/templates/hbm/array.hbm.ftl
===================================================================
--- trunk/HibernateExt/tools/src/templates/hbm/array.hbm.ftl 2006-10-03 23:50:05 UTC (rev 10547)
+++ trunk/HibernateExt/tools/src/templates/hbm/array.hbm.ftl 2006-10-03 23:52:56 UTC (rev 10548)
@@ -9,6 +9,8 @@
<#assign toManyClass = value.getElement().getType().getAssociatedEntityName()>
</#if>
<array name="${property.name}" cascade="${property.cascade}"
+ <#assign metaattributable=property>
+ <#include "meta.hbm.ftl">
<#if c2h.hasFetchMode(property)> fetch="${fetch}"</#if>>
<key>
<#foreach column in dependentValue.columnIterator>
Modified: trunk/HibernateExt/tools/src/templates/hbm/bag.hbm.ftl
===================================================================
--- trunk/HibernateExt/tools/src/templates/hbm/bag.hbm.ftl 2006-10-03 23:50:05 UTC (rev 10547)
+++ trunk/HibernateExt/tools/src/templates/hbm/bag.hbm.ftl 2006-10-03 23:52:56 UTC (rev 10548)
@@ -2,6 +2,9 @@
name="${property.name}"
inverse="${property.value.inverse?string}"
>
+ <#assign metaattributable=property>
+ <#include "meta.hbm.ftl">
+
<key>
<#foreach column in property.value.key.columnIterator>
<#include "column.hbm.ftl">
Modified: trunk/HibernateExt/tools/src/templates/hbm/component.hbm.ftl
===================================================================
--- trunk/HibernateExt/tools/src/templates/hbm/component.hbm.ftl 2006-10-03 23:50:05 UTC (rev 10547)
+++ trunk/HibernateExt/tools/src/templates/hbm/component.hbm.ftl 2006-10-03 23:52:56 UTC (rev 10548)
@@ -1,5 +1,8 @@
<component
name="${property.name}"
class="${property.value.componentClassName}">
+ <#assign metaattributable=property>
+ <#include "meta.hbm.ftl">
+
<!-- TODO -->
</component>
\ No newline at end of file
Modified: trunk/HibernateExt/tools/src/templates/hbm/id.hbm.ftl
===================================================================
--- trunk/HibernateExt/tools/src/templates/hbm/id.hbm.ftl 2006-10-03 23:50:05 UTC (rev 10547)
+++ trunk/HibernateExt/tools/src/templates/hbm/id.hbm.ftl 2006-10-03 23:52:56 UTC (rev 10548)
@@ -27,6 +27,9 @@
access="${property.propertyAccessorName}"
</#if>
>
+ <#assign metaattributable=property>
+ <#include "meta.hbm.ftl">
+
<#foreach column in property.columnIterator>
<#include "pkcolumn.hbm.ftl">
</#foreach>
Modified: trunk/HibernateExt/tools/src/templates/hbm/list.hbm.ftl
===================================================================
--- trunk/HibernateExt/tools/src/templates/hbm/list.hbm.ftl 2006-10-03 23:50:05 UTC (rev 10547)
+++ trunk/HibernateExt/tools/src/templates/hbm/list.hbm.ftl 2006-10-03 23:52:56 UTC (rev 10548)
@@ -2,6 +2,9 @@
name="${property.name}"
inverse="${property.value.inverse?string}"
>
+ <#assign metaattributable=property>
+ <#include "meta.hbm.ftl">
+
<key>
<#foreach column in property.value.key.columnIterator>
<#include "column.hbm.ftl">
Modified: trunk/HibernateExt/tools/src/templates/hbm/many-to-one.hbm.ftl
===================================================================
--- trunk/HibernateExt/tools/src/templates/hbm/many-to-one.hbm.ftl 2006-10-03 23:50:05 UTC (rev 10547)
+++ trunk/HibernateExt/tools/src/templates/hbm/many-to-one.hbm.ftl 2006-10-03 23:52:56 UTC (rev 10548)
@@ -25,11 +25,11 @@
<#if formula>
formula="${formula.text}"
</#if>
- />
-<#else>
+</#if>
>
+ <#assign metaattributable=property>
+ <#include "meta.hbm.ftl">
<#foreach column in property.columnIterator>
<#include "column.hbm.ftl">
</#foreach>
</many-to-one>
-</#if>
Added: trunk/HibernateExt/tools/src/templates/hbm/meta.hbm.ftl
===================================================================
--- trunk/HibernateExt/tools/src/templates/hbm/meta.hbm.ftl 2006-10-03 23:50:05 UTC (rev 10547)
+++ trunk/HibernateExt/tools/src/templates/hbm/meta.hbm.ftl 2006-10-03 23:52:56 UTC (rev 10548)
@@ -0,0 +1,7 @@
+<#if metaattributable.getMetaAttributes()?exists>
+<#list metaattributable.getMetaAttributes().keySet() as key>
+ <#list metaattributable.getMetaAttributes().get(key).values as value>
+ <meta attribute="${key}" inherit="false">${value}</meta>
+ </#list>
+</#list>
+</#if>
\ No newline at end of file
Modified: trunk/HibernateExt/tools/src/templates/hbm/persistentclass.hbm.ftl
===================================================================
--- trunk/HibernateExt/tools/src/templates/hbm/persistentclass.hbm.ftl 2006-10-03 23:50:05 UTC (rev 10547)
+++ trunk/HibernateExt/tools/src/templates/hbm/persistentclass.hbm.ftl 2006-10-03 23:52:56 UTC (rev 10548)
@@ -59,6 +59,9 @@
<#if clazz.table.rowId?exists>
rowid="${clazz.table.rowId}"
</#if>>
+<#assign metaattributable=clazz/>
+<#include "meta.hbm.ftl"/>
+
<#if clazz.table.comment?exists>
<comment>${clazz.table.comment}</comment>
</#if>
Modified: trunk/HibernateExt/tools/src/templates/hbm/primitive-array.hbm.ftl
===================================================================
--- trunk/HibernateExt/tools/src/templates/hbm/primitive-array.hbm.ftl 2006-10-03 23:50:05 UTC (rev 10547)
+++ trunk/HibernateExt/tools/src/templates/hbm/primitive-array.hbm.ftl 2006-10-03 23:52:56 UTC (rev 10548)
@@ -1,5 +1,7 @@
<#assign value = property.value><#assign table = value.getElement().getTable().getName()><#assign dependentValue = value.getKey()>
<primitive-array name="${property.name}" table="${table}">
+ <#assign metaattributable=property>
+ <#include "meta.hbm.ftl">
<key>
<#foreach column in dependentValue.getColumnIterator()>
<#include "column.hbm.ftl">
Modified: trunk/HibernateExt/tools/src/templates/hbm/property.hbm.ftl
===================================================================
--- trunk/HibernateExt/tools/src/templates/hbm/property.hbm.ftl 2006-10-03 23:50:05 UTC (rev 10547)
+++ trunk/HibernateExt/tools/src/templates/hbm/property.hbm.ftl 2006-10-03 23:52:56 UTC (rev 10548)
@@ -21,10 +21,12 @@
<#if formula?has_content>
formula="${formula.text}"
</#if>
- />
-<#else>
+</#if>
>
+ <#assign metaattributable=property>
+ <#include "meta.hbm.ftl">
<#foreach column in property.columnIterator>
<#include "column.hbm.ftl">
- </#foreach> </property>
-</#if>
+ </#foreach>
+ </property>
+
Modified: trunk/HibernateExt/tools/src/templates/hbm/set.hbm.ftl
===================================================================
--- trunk/HibernateExt/tools/src/templates/hbm/set.hbm.ftl 2006-10-03 23:50:05 UTC (rev 10547)
+++ trunk/HibernateExt/tools/src/templates/hbm/set.hbm.ftl 2006-10-03 23:52:56 UTC (rev 10548)
@@ -5,6 +5,8 @@
table="${property.value.collectionTable.name}"
</#if>
>
+ <#assign metaattributable=property>
+ <#include "meta.hbm.ftl">
<key>
<#foreach column in property.value.key.columnIterator>
<#include "column.hbm.ftl">
Modified: trunk/HibernateExt/tools/src/templates/hbm/timestamp.hbm.ftl
===================================================================
--- trunk/HibernateExt/tools/src/templates/hbm/timestamp.hbm.ftl 2006-10-03 23:50:05 UTC (rev 10547)
+++ trunk/HibernateExt/tools/src/templates/hbm/timestamp.hbm.ftl 2006-10-03 23:52:56 UTC (rev 10548)
@@ -1,7 +1,7 @@
<timestamp
name="${property.name}"
<#if !property.basicPropertyAccessor> access="${property.propertyAccessorName}"
-</#if><#foreach column in property.columnIterator> <#-- always only one column, but no direct access method.
---> column="${column.quotedName}"
+</#if><#foreach column in property.columnIterator> <#-- always only one column, but no direct access method.-->
+ column="${column.quotedName}"
</#foreach> />
Modified: trunk/HibernateExt/tools/src/templates/hbm/version.hbm.ftl
===================================================================
--- trunk/HibernateExt/tools/src/templates/hbm/version.hbm.ftl 2006-10-03 23:50:05 UTC (rev 10547)
+++ trunk/HibernateExt/tools/src/templates/hbm/version.hbm.ftl 2006-10-03 23:52:56 UTC (rev 10548)
@@ -3,5 +3,8 @@
type="${property.value.typeName}"
<#if !property.basicPropertyAccessor> access="${property.propertyAccessorName}"
</#if> >
-<#foreach column in property.columnIterator> <#include "column.hbm.ftl"></#foreach> </version>
+<#foreach column in property.columnIterator>
+ <#include "column.hbm.ftl">
+</#foreach>
+ </version>
17 years, 6 months
Hibernate SVN: r10547 - in trunk/HibernateExt/tools/src: java/org/hibernate/tool/hbm2x java/org/hibernate/tool/hbm2x/doc java/org/hibernate/tool/hbm2x/visitor templates/doc templates/doc/entities templates/doc/tables templates/dot
by hibernate-commits@lists.jboss.org
Author: max.andersen(a)jboss.com
Date: 2006-10-03 19:50:05 -0400 (Tue, 03 Oct 2006)
New Revision: 10547
Modified:
trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/Cfg2HbmTool.java
trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/DocExporter.java
trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/XMLPrettyPrinter.java
trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/doc/DocFileManager.java
trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/jtidy.properties
trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/visitor/EntityNameFromValueVisitor.java
trunk/HibernateExt/tools/src/templates/doc/entities/summary.ftl
trunk/HibernateExt/tools/src/templates/doc/index.html
trunk/HibernateExt/tools/src/templates/doc/tables/summary.ftl
trunk/HibernateExt/tools/src/templates/dot/entitygraph.dot.ftl
Log:
HBX-773 generate a clickable map to navigate from graph to documentation
HBX-771 Add graphical views based on graphviz to the DocExporter
Modified: trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/Cfg2HbmTool.java
===================================================================
--- trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/Cfg2HbmTool.java 2006-10-03 22:21:15 UTC (rev 10546)
+++ trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/Cfg2HbmTool.java 2006-10-03 23:50:05 UTC (rev 10547)
@@ -16,14 +16,23 @@
import org.hibernate.engine.query.sql.NativeSQLQueryJoinReturn;
import org.hibernate.engine.query.sql.NativeSQLQueryReturn;
import org.hibernate.engine.query.sql.NativeSQLQueryRootReturn;
+import org.hibernate.mapping.Any;
+import org.hibernate.mapping.Array;
+import org.hibernate.mapping.Bag;
import org.hibernate.mapping.Collection;
import org.hibernate.mapping.Column;
+import org.hibernate.mapping.Component;
+import org.hibernate.mapping.DependantValue;
import org.hibernate.mapping.Formula;
+import org.hibernate.mapping.IdentifierBag;
import org.hibernate.mapping.JoinedSubclass;
+import org.hibernate.mapping.List;
import org.hibernate.mapping.ManyToOne;
import org.hibernate.mapping.OneToMany;
+import org.hibernate.mapping.OneToOne;
import org.hibernate.mapping.PersistentClass;
import org.hibernate.mapping.PersistentClassVisitor;
+import org.hibernate.mapping.PrimitiveArray;
import org.hibernate.mapping.Property;
import org.hibernate.mapping.RootClass;
import org.hibernate.mapping.SimpleValue;
@@ -31,9 +40,11 @@
import org.hibernate.mapping.Subclass;
import org.hibernate.mapping.UnionSubclass;
import org.hibernate.mapping.Value;
+import org.hibernate.mapping.ValueVisitor;
import org.hibernate.persister.entity.JoinedSubclassEntityPersister;
import org.hibernate.persister.entity.SingleTableEntityPersister;
import org.hibernate.persister.entity.UnionSubclassEntityPersister;
+import org.hibernate.tool.hbm2x.visitor.EntityNameFromValueVisitor;
import org.hibernate.tool.hbm2x.visitor.HBMTagForPersistentClassVisitor;
import org.hibernate.tool.hbm2x.visitor.HBMTagForValueVisitor;
@@ -346,4 +357,8 @@
Boolean object = (Boolean) clazz.accept( new HasEntityPersisterVisitor( name ) );
return object.booleanValue();
}
+
+ public String getHibernateTypeName(Property p) {
+ return (String) p.getValue().accept(new EntityNameFromValueVisitor());
+ }
}
Modified: trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/DocExporter.java
===================================================================
--- trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/DocExporter.java 2006-10-03 22:21:15 UTC (rev 10546)
+++ trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/DocExporter.java 2006-10-03 23:50:05 UTC (rev 10547)
@@ -1,18 +1,23 @@
package org.hibernate.tool.hbm2x;
+import java.io.BufferedReader;
import java.io.File;
+import java.io.FileReader;
import java.io.IOException;
+import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import org.hibernate.HibernateException;
import org.hibernate.cfg.Configuration;
import org.hibernate.mapping.Table;
import org.hibernate.tool.hbm2x.doc.DocFile;
import org.hibernate.tool.hbm2x.doc.DocFileManager;
import org.hibernate.tool.hbm2x.doc.DocHelper;
import org.hibernate.tool.hbm2x.pojo.POJOClass;
+import org.hibernate.util.StringHelper;
/**
* Exporter implementation that creates Hibernate Documentation.
@@ -47,67 +52,67 @@
/**
* Template used for the index of the table documentation.
*/
- private static final String VM_TABLES_INDEX = "doc/tables/index.ftl";
+ private static final String FTL_TABLES_INDEX = "doc/tables/index.ftl";
/**
* Template used for index of the entity documentation
*/
- private static final String VM_ENTITIES_INDEX = "doc/entities/index.ftl";
+ private static final String FTL_ENTITIES_INDEX = "doc/entities/index.ftl";
/**
* Template used for the Classes Summary
*/
- private static final String VM_ENTITIES_SUMMARY = "doc/entities/summary.ftl";
+ private static final String FTL_ENTITIES_SUMMARY = "doc/entities/summary.ftl";
/**
* Template used for Class details
*/
- private static final String VM_ENTITIES_ENTITY = "doc/entities/entity.ftl";
+ private static final String FTL_ENTITIES_ENTITY = "doc/entities/entity.ftl";
/**
* Template used to create the Package List
*/
- private static final String VM_ENTITIES_PACKAGE_LIST = "doc/entities/package-list.ftl";
+ private static final String FTL_ENTITIES_PACKAGE_LIST = "doc/entities/package-list.ftl";
/**
* Template used to create the list of all Classes
*/
- private static final String VM_ENTITIES_ENTITY_LIST = "doc/entities/allEntity-list.ftl";
+ private static final String FTL_ENTITIES_ENTITY_LIST = "doc/entities/allEntity-list.ftl";
/**
* Template used to create List of Classes specific to packages.
*/
- private static final String VM_ENTITIES_PERPACKAGE_ENTITY_LIST = "doc/entities/perPackageEntity-list.ftl";
+ private static final String FTL_ENTITIES_PERPACKAGE_ENTITY_LIST = "doc/entities/perPackageEntity-list.ftl";
/**
* Template used to show the specific package details
*/
- private static final String VM_ENTITIES_PACKAGE_SUMMARY = "doc/entities/package-summary.ftl";
+ private static final String FTL_ENTITIES_PACKAGE_SUMMARY = "doc/entities/package-summary.ftl";
/**
* Template used for the Tables Summary.
*/
- private static final String VM_TABLES_SUMMARY = "doc/tables/summary.ftl";
+ private static final String FTL_TABLES_SUMMARY = "doc/tables/summary.ftl";
/**
* Template used for table lists.
*/
- private static final String VM_TABLES_TABLE_LIST = "doc/tables/table-list.ftl";
+ private static final String FTL_TABLES_TABLE_LIST = "doc/tables/table-list.ftl";
/**
* Template used for schema lists.
*/
- private static final String VM_TABLES_SCHEMA_LIST = "doc/tables/schema-list.ftl";
+ private static final String FTL_TABLES_SCHEMA_LIST = "doc/tables/schema-list.ftl";
/**
* Template used for Schema Summary.
*/
- private static final String VM_TABLES_SCHEMA_SUMMARY = "doc/tables/schema-summary.ftl";
+ private static final String FTL_TABLES_SCHEMA_SUMMARY = "doc/tables/schema-summary.ftl";
/**
* Template used for the Table Details.
*/
- private static final String VM_TABLES_TABLE = "doc/tables/table.ftl";
+ private static final String FTL_TABLES_TABLE = "doc/tables/table.ftl";
/**
* Doc helper.
@@ -142,8 +147,10 @@
public void doStart() throws ExporterException {
generateCommmonAndAssets();
+
+ boolean graphsGenerated = generateDot();
generateTablesIndex();
- generateTablesSummary();
+ generateTablesSummary(graphsGenerated);
generateTablesDetails();
generateTablesAllSchemasList();
generateTablesAllTablesList();
@@ -151,14 +158,117 @@
generateTablesSchemaDetailedInfo();
generateEntitiesIndex();
- generatePackageSummary();
+ generatePackageSummary(graphsGenerated);
generateEntitiesDetails();
generateEntitiesAllPackagesList();
generateEntitiesAllEntitiesList();
generateEntitiesPackageEntityList();
generateEntitiesPackageDetailedInfo();
+
+
}
+ private boolean generateDot() {
+ String cmd = getProperties().getProperty( "dot.executable" );
+
+ if(StringHelper.isNotEmpty( cmd )) {
+ try {
+ GenericExporter exporter = new GenericExporter(getConfiguration(), getOutputDirectory());
+ exporter.setTemplateName( "dot/entitygraph.dot.ftl" );
+ exporter.setFilePattern( "entities/entitygraph.dot" );
+ exporter.setArtifactCollector( getArtifactCollector() );
+ exporter.setProperties( getProperties() );
+ exporter.setTemplatePath( getTemplatePaths() );
+ exporter.start();
+
+ exporter.setTemplateName( "dot/tablegraph.dot.ftl" );
+ exporter.setFilePattern( "tables/tablegraph.dot" );
+ exporter.setProperties( getProperties() );
+ exporter.start();
+
+ dotToFile( cmd, new File(getOutputDirectory(), "entities/entitygraph.dot").toString(), new File(getOutputDirectory(), "entities/entitygraph.png").toString());
+ dotToFile( cmd, new File(getOutputDirectory(), "entities/entitygraph.dot").toString(), new File(getOutputDirectory(), "entities/entitygraph.svg").toString());
+ dotToFile( cmd, new File(getOutputDirectory(), "entities/entitygraph.dot").toString(), new File(getOutputDirectory(), "entities/entitygraph.cmap").toString());
+
+ dotToFile( cmd, new File(getOutputDirectory(), "tables/tablegraph.dot").toString(), new File(getOutputDirectory(), "tables/tablegraph.png").toString());
+ dotToFile( cmd, new File(getOutputDirectory(), "tables/tablegraph.dot").toString(), new File(getOutputDirectory(), "tables/tablegraph.svg").toString());
+ dotToFile( cmd, new File(getOutputDirectory(), "tables/tablegraph.dot").toString(), new File(getOutputDirectory(), "tables/tablegraph.cmap").toString());
+
+ return true;
+
+ }
+ catch (IOException e) {
+ throw new HibernateException("Problem while generating DOT graph for Configuration", e);
+ }
+ } else {
+ log.info( "Skipping entitygraph creation since dot.executable is empty or not-specified." );
+ return false;
+ }
+ }
+
+ public static final String OS_NAME = System.getProperty("os.name");
+ public static final boolean IS_LINUX = OS_NAME.startsWith("Linux");
+
+ private String escape(String fileName){
+
+ // Linux does not need " " around file names
+ if (IS_LINUX){
+ return fileName;
+ }
+
+ // Windows needs " " around file names; actually we do not
+ // need it always, only when spaces are present;
+ // but it does not hurt to usem them always
+ return "\"" + fileName + "\"";
+
+ }
+
+ private void dotToFile(String dotExeFileName, String dotFileName, String outFileName) throws IOException {
+
+ //
+ // dot.exe works by taking *.dot file and piping
+ // results into another file, for example:
+ // d:\graphviz-1.12\bin\dot.exe -Tgif c:\temp\ManualDraw.dot > c:\temp\ManualDraw.gif
+ // so we follow that model here and read stdout until EOF
+ //
+
+ final String exeCmd =
+ escape(dotExeFileName) +
+ " -T" + getFormatForFile(outFileName) + " " +
+ escape(dotFileName) +
+ " -o " +
+ escape(outFileName);
+
+ Process p = Runtime.getRuntime().exec(exeCmd);
+ //p.getErrorStream().
+ try {
+ log.debug( "Executing: " + exeCmd );
+// Get the input stream and read from it
+ InputStream in = p.getErrorStream();
+ int c;
+ while ((c = in.read()) != -1) {
+ System.out.print((char)c);
+ }
+ in.close();
+ int i = p.waitFor( );
+ if(i!=0) {
+ //TODO: dump system.err
+ log.error("Error " + i + " while executing: " + exeCmd);
+ }
+ } catch(Exception ie){
+ log.error( "Error while executing: " + exeCmd, ie );
+ }
+ }
+
+ private String getFormatForFile(String outFileName){
+ int idx = outFileName.lastIndexOf(".");
+ if (idx == -1 || idx == outFileName.length() - 1){
+ throw new IllegalArgumentException("Can't determine file name extention for file name " + outFileName);
+ }
+ return outFileName.substring(idx + 1);
+ }
+
+
protected void setupContext() {
getProperties().put("jdk5", "" + useJdk5());
super.setupContext();
@@ -207,7 +317,7 @@
Map parameters = new HashMap();
parameters.put("docFile", docFile);
- processTemplate(parameters, VM_TABLES_INDEX, file);
+ processTemplate(parameters, FTL_TABLES_INDEX, file);
}
/**
@@ -218,28 +328,51 @@
File file = docFile.getFile();
Map parameters = new HashMap();
parameters.put("docFile", docFile);
- processTemplate(parameters, VM_ENTITIES_INDEX, file );
+ processTemplate(parameters, FTL_ENTITIES_INDEX, file );
}
/**
* Generate a file with an summary of all the tables.
+ * @param graphsGenerated
*/
- public void generateTablesSummary() {
+ public void generateTablesSummary(boolean graphsGenerated) {
DocFile docFile = docFileManager.getTableSummaryDocFile();
File file = docFileManager.getTableSummaryDocFile().getFile();
Map parameters = new HashMap();
parameters.put("docFile", docFile);
+ parameters.put( "graphsGenerated", Boolean.valueOf( graphsGenerated ) );
+ if(graphsGenerated) {
+ StringBuffer sb = new StringBuffer();
+ String fileName = "tables/tablegraph.cmap";
+ appendFile( sb, fileName );
+ parameters.put( "tablegrapharea", sb );
+ }
+
+ processTemplate(parameters, FTL_TABLES_SUMMARY, file);
+ }
- processTemplate(parameters, VM_TABLES_SUMMARY, file);
- }
+ private void appendFile(StringBuffer sb, String fileName) {
+ try {
+ BufferedReader in = new BufferedReader(new FileReader(new File(getOutputDirectory(), fileName)));
+ String str;
+
+ while ((str = in.readLine()) != null) {
+ sb.append(str);
+ sb.append(System.getProperty("line.separator"));
+ }
+
+ in.close();
+ } catch (IOException e) {
+ }
+ }
/**
* Generate summary (summaty.html) to show all the packages
*
*/
- public void generatePackageSummary(){
+ public void generatePackageSummary(boolean graphsGenerated){
DocFile docFile = docFileManager.getClassSummaryFile();
File file = docFile.getFile();
@@ -250,8 +383,15 @@
//Remove All Classes
list.remove(0);
parameters.put("packageList", list );
-
- processTemplate(parameters, VM_ENTITIES_SUMMARY, file);
+ parameters.put( "graphsGenerated", Boolean.valueOf( graphsGenerated ) );
+ if(graphsGenerated) {
+ StringBuffer sb = new StringBuffer();
+ String fileName = "entities/entitygraph.cmap";
+ appendFile( sb, fileName );
+ parameters.put( "entitygrapharea", sb );
+ }
+
+ processTemplate(parameters, FTL_ENTITIES_SUMMARY, file);
}
/**
@@ -270,7 +410,7 @@
parameters.put("docFile", docFile);
parameters.put("table", table);
- processTemplate(parameters, VM_TABLES_TABLE, file);
+ processTemplate(parameters, FTL_TABLES_TABLE, file);
}
}
}
@@ -291,7 +431,7 @@
Map parameters = new HashMap();
parameters.put("docFile", docFile);
parameters.put("class", pcObj);
- processTemplate(parameters, VM_ENTITIES_ENTITY, file);
+ processTemplate(parameters, FTL_ENTITIES_ENTITY, file);
}
}
@@ -312,7 +452,7 @@
list.remove(0);
parameters.put("packageList", list );
- processTemplate(parameters, VM_ENTITIES_PACKAGE_LIST, file);
+ processTemplate(parameters, FTL_ENTITIES_PACKAGE_LIST, file);
}
/**
@@ -329,7 +469,7 @@
parameters.put("title", "All Entities");
parameters.put("classList", docHelper.getClasses());
- processTemplate(parameters, VM_ENTITIES_ENTITY_LIST, file);
+ processTemplate(parameters, FTL_ENTITIES_ENTITY_LIST, file);
}
/**
@@ -350,7 +490,7 @@
parameters.put("docFile", docFile);
parameters.put("title", packageName);
parameters.put("classList", docHelper.getClasses(packageName));
- processTemplate(parameters, VM_ENTITIES_PERPACKAGE_ENTITY_LIST, file);
+ processTemplate(parameters, FTL_ENTITIES_PERPACKAGE_ENTITY_LIST, file);
}
@@ -375,7 +515,7 @@
parameters.put("package", packageName);
parameters.put("classList", docHelper.getClasses(packageName));
- processTemplate(parameters, VM_ENTITIES_PACKAGE_SUMMARY,
+ processTemplate(parameters, FTL_ENTITIES_PACKAGE_SUMMARY,
summaryDocFile.getFile() );
}
}
@@ -393,7 +533,7 @@
parameters.put("title", "Schema List");
parameters.put("schemaList", docHelper.getSchemas() );
- processTemplate(parameters, VM_TABLES_SCHEMA_LIST, file);
+ processTemplate(parameters, FTL_TABLES_SCHEMA_LIST, file);
}
/**
@@ -409,7 +549,7 @@
parameters.put("title", "All Tables");
parameters.put("tableList", docHelper.getTables() );
- processTemplate(parameters, VM_TABLES_TABLE_LIST, file);
+ processTemplate(parameters, FTL_TABLES_TABLE_LIST, file);
}
public void generateTablesSchemaTableList() {
@@ -427,7 +567,7 @@
parameters.put("title", "Tables for " + schemaName);
parameters.put("tableList", docHelper.getTables(schemaName) );
- processTemplate(parameters, VM_TABLES_TABLE_LIST, file);
+ processTemplate(parameters, FTL_TABLES_TABLE_LIST, file);
}
}
@@ -446,7 +586,7 @@
parameters.put("docFile", summaryDocFile);
parameters.put("schema", schemaName);
- processTemplate(parameters, VM_TABLES_SCHEMA_SUMMARY,
+ processTemplate(parameters, FTL_TABLES_SCHEMA_SUMMARY,
summaryDocFile.getFile() );
DocFile tableListDocFile = docFileManager.getSchemaSummaryDocFile(schemaName);
@@ -455,8 +595,10 @@
parameters.put("docFile", tableListDocFile);
parameters.put("schema", schemaName);
- processTemplate(parameters, VM_TABLES_SCHEMA_SUMMARY,
+ processTemplate(parameters, FTL_TABLES_SCHEMA_SUMMARY,
tableListDocFile.getFile() );
+
+ //processTemplate( new HashMap(), templateName, outputFile );
}
}
Modified: trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/XMLPrettyPrinter.java
===================================================================
--- trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/XMLPrettyPrinter.java 2006-10-03 22:21:15 UTC (rev 10546)
+++ trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/XMLPrettyPrinter.java 2006-10-03 23:50:05 UTC (rev 10547)
@@ -17,7 +17,6 @@
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.Writer;
-import java.util.Arrays;
import java.util.Properties;
import org.apache.commons.logging.Log;
Modified: trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/doc/DocFileManager.java
===================================================================
--- trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/doc/DocFileManager.java 2006-10-03 22:21:15 UTC (rev 10546)
+++ trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/doc/DocFileManager.java 2006-10-03 23:50:05 UTC (rev 10547)
@@ -132,6 +132,10 @@
* Map with package class lists DocFiles keyed by package name
*/
private Map packageEntityListDocFile = new HashMap();
+
+ public DocFolder getRootDocFolder() {
+ return rootDocFolder;
+ }
/**
* Constructor.
Modified: trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/jtidy.properties
===================================================================
--- trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/jtidy.properties 2006-10-03 22:21:15 UTC (rev 10546)
+++ trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/jtidy.properties 2006-10-03 23:50:05 UTC (rev 10547)
@@ -6,4 +6,5 @@
clean=yes
output-xml=yes
input-xml=yes
-show-warnings=yes
\ No newline at end of file
+show-warnings=yes
+trim-empty-elements=yes
\ No newline at end of file
Modified: trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/visitor/EntityNameFromValueVisitor.java
===================================================================
--- trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/visitor/EntityNameFromValueVisitor.java 2006-10-03 22:21:15 UTC (rev 10546)
+++ trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/visitor/EntityNameFromValueVisitor.java 2006-10-03 23:50:05 UTC (rev 10547)
@@ -1,8 +1,16 @@
package org.hibernate.tool.hbm2x.visitor;
+import org.hibernate.mapping.Array;
+import org.hibernate.mapping.Bag;
+import org.hibernate.mapping.Collection;
+import org.hibernate.mapping.Component;
+import org.hibernate.mapping.List;
import org.hibernate.mapping.ManyToOne;
+import org.hibernate.mapping.Map;
import org.hibernate.mapping.OneToMany;
import org.hibernate.mapping.OneToOne;
+import org.hibernate.mapping.PrimitiveArray;
+import org.hibernate.mapping.SimpleValue;
import org.hibernate.mapping.ToOne;
public class EntityNameFromValueVisitor extends DefaultValueVisitor {
@@ -26,5 +34,39 @@
public Object accept(OneToMany value) {
return value.getAssociatedClass().getEntityName();
}
-
+
+ public Object acceptCollection(Collection c) {
+ return c.getElement().accept( this );
+ }
+
+ public Object accept(Bag o) {
+ return acceptCollection( o );
+ }
+
+ public Object accept(List o) {
+ return acceptCollection( o );
+ }
+
+ public Object accept(Map o) {
+ return acceptCollection( o );
+ }
+
+ public Object accept(Array o) {
+ return acceptCollection( o );
+ }
+
+ public Object accept(PrimitiveArray o) {
+ return acceptCollection( o );
+ }
+
+ public Object accept(SimpleValue o) {
+ return null; // TODO: return o.getTypeName() ? (it is not an association)
+ }
+
+ public Object accept(Component component) {
+ if(component.isDynamic()) {
+ return null; //"java.util.Map"; (not an association)
+ }
+ return component.getComponentClassName();
+ }
}
Modified: trunk/HibernateExt/tools/src/templates/doc/entities/summary.ftl
===================================================================
--- trunk/HibernateExt/tools/src/templates/doc/entities/summary.ftl 2006-10-03 22:21:15 UTC (rev 10546)
+++ trunk/HibernateExt/tools/src/templates/doc/entities/summary.ftl 2006-10-03 23:50:05 UTC (rev 10547)
@@ -14,6 +14,15 @@
<H1>Hibernate Mapping Documentation</H1>
+<#if graphsGenerated>
+<p>
+ <img src="entitygraph.png" usemap="#entitygraph"/>
+ <map name="entitygraph">
+ ${entitygrapharea}
+ </map>
+</p>
+</#if>
+
<H2>List of Packages</H2>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0">
Modified: trunk/HibernateExt/tools/src/templates/doc/index.html
===================================================================
--- trunk/HibernateExt/tools/src/templates/doc/index.html 2006-10-03 22:21:15 UTC (rev 10546)
+++ trunk/HibernateExt/tools/src/templates/doc/index.html 2006-10-03 23:50:05 UTC (rev 10547)
@@ -12,7 +12,7 @@
<FRAMESET rows="50px,80%">
<FRAME src="header.html" name="headerFrame" title="Header">
- <FRAME src="tables/index.html" name="mainFrame" title="Main">
+ <FRAME src="entities/index.html" name="mainFrame" title="Main">
<NOFRAMES>
<H2>Frame Alert</H2>
This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web browser.
Modified: trunk/HibernateExt/tools/src/templates/doc/tables/summary.ftl
===================================================================
--- trunk/HibernateExt/tools/src/templates/doc/tables/summary.ftl 2006-10-03 22:21:15 UTC (rev 10546)
+++ trunk/HibernateExt/tools/src/templates/doc/tables/summary.ftl 2006-10-03 23:50:05 UTC (rev 10547)
@@ -14,6 +14,15 @@
<H1>Hibernate Mapping Documentation</H1>
+<#if graphsGenerated>
+<p>
+ <img src="tablegraph.png" usemap="#tablegraph"/>
+ <map name="tablegraph">
+ ${tablegrapharea}
+ </map>
+</p>
+</#if>
+
<H2>List of Tables by Schema</H2>
<#foreach schema in dochelper.tablesBySchema.keySet()>
Modified: trunk/HibernateExt/tools/src/templates/dot/entitygraph.dot.ftl
===================================================================
--- trunk/HibernateExt/tools/src/templates/dot/entitygraph.dot.ftl 2006-10-03 22:21:15 UTC (rev 10546)
+++ trunk/HibernateExt/tools/src/templates/dot/entitygraph.dot.ftl 2006-10-03 23:50:05 UTC (rev 10547)
@@ -23,10 +23,10 @@
<#foreach entity in cfg.classMappings>
/* Node ${entity.entityName} */
- <@nodeName entity.entityName/> [ label = "<@propertyLabels name=entity.entityName properties=entity.propertyIterator/>" ]
+ <@nodeName entity.entityName/> [ label = "<@propertyLabels name=entity.entityName properties=entity.propertyIterator/>", URL="${entity.entityName?replace(".","/")}.html" ]
/* Subclass edges for ${entity.entityName} */
<#foreach subclass in entity.getDirectSubclasses()>
- <@nodeName subclass.entityName/> -> <@nodeName entity.entityName/> [ weight="10", arrowhead="onormal" ]
+ <@nodeName subclass.entityName/> -> <@nodeName entity.entityName/> [ weight="10", arrowhead="onormal" ]
</#foreach>
<@propertyEdges root=entity.entityName?replace(".","_dot_") properties=entity.propertyIterator/>
17 years, 6 months
Hibernate SVN: r10546 - in trunk/HibernateExt/tools/src/templates: . dot
by hibernate-commits@lists.jboss.org
Author: max.andersen(a)jboss.com
Date: 2006-10-03 18:21:15 -0400 (Tue, 03 Oct 2006)
New Revision: 10546
Added:
trunk/HibernateExt/tools/src/templates/dot/
trunk/HibernateExt/tools/src/templates/dot/entitygraph.dot.ftl
trunk/HibernateExt/tools/src/templates/dot/tablegraph.dot.ftl
Log:
HBX-772 create templates for generating dot fiels for entity and table layout
Added: trunk/HibernateExt/tools/src/templates/dot/entitygraph.dot.ftl
===================================================================
--- trunk/HibernateExt/tools/src/templates/dot/entitygraph.dot.ftl 2006-10-03 22:17:22 UTC (rev 10545)
+++ trunk/HibernateExt/tools/src/templates/dot/entitygraph.dot.ftl 2006-10-03 22:21:15 UTC (rev 10546)
@@ -0,0 +1,75 @@
+digraph EntityGraph {
+ compound=true;
+ bgcolor="white";
+ fontcolor="black"; fontname="Helvetica"; fontsize="10.0";
+ ranksep="equally";
+ label="Entity Graph";
+ URL="http://tools.hibernate.org";
+ edge [
+ color="lightgrey",
+ fontcolor="black",
+ fontname="Helvetica",
+ fontsize="8.0",
+ labelangle=-25.0,
+ labeldistance=1.5
+ ];
+ node [
+ fontcolor="black",
+ fontname="Helvetica",
+ fontsize="10.0",
+ shape=record,
+ fillcolor="#D4E5FE",
+ style="solid,filled"];
+
+<#foreach entity in cfg.classMappings>
+ /* Node ${entity.entityName} */
+ <@nodeName entity.entityName/> [ label = "<@propertyLabels name=entity.entityName properties=entity.propertyIterator/>" ]
+ /* Subclass edges for ${entity.entityName} */
+ <#foreach subclass in entity.getDirectSubclasses()>
+ <@nodeName subclass.entityName/> -> <@nodeName entity.entityName/> [ weight="10", arrowhead="onormal" ]
+ </#foreach>
+
+ <@propertyEdges root=entity.entityName?replace(".","_dot_") properties=entity.propertyIterator/>
+</#foreach>
+
+}
+
+<#macro nodeName name>${name?replace(".","_dot_")}</#macro>
+
+<#macro propertyLabels name properties>
+<@compress single_line=true>
+ {
+ ${name?replace(".","\\.")}|
+ <#foreach p in properties>
+ <#if p.value.isSimpleValue()>
+ ${p.name}\l
+ </#if>
+ </#foreach>
+ }</@compress></#macro>
+
+<#macro dumpComponent compProperty>
+ <#assign component=compProperty.value>
+ /* Node component ${component} */
+ ${c2h.getHibernateTypeName(compProperty)?replace(".","_dot_")} [
+ label = "<@propertyLabels name=component.componentClassName properties=component.propertyIterator/>"
+ ]
+ <@propertyEdges root=component.componentClassName?replace(".","_dot_") properties=component.propertyIterator/>
+</#macro>
+
+<#macro propertyEdges root properties>
+ /* Property edges/nodes for ${root} */
+ <#foreach property in properties>
+ <#if c2h.getHibernateTypeName(property)?exists>
+ ${root} -> ${c2h.getHibernateTypeName(property)?replace(".","_dot_")} [
+ label="${property.name}"
+ <#if c2j.isComponent(property)>
+ arrowtail="diamond"
+ </#if>
+ ]
+ </#if>
+ <#if c2j.isComponent(property)>
+ <@dumpComponent property/>
+ </#if>
+
+ </#foreach>
+</#macro>
\ No newline at end of file
Added: trunk/HibernateExt/tools/src/templates/dot/tablegraph.dot.ftl
===================================================================
--- trunk/HibernateExt/tools/src/templates/dot/tablegraph.dot.ftl 2006-10-03 22:17:22 UTC (rev 10545)
+++ trunk/HibernateExt/tools/src/templates/dot/tablegraph.dot.ftl 2006-10-03 22:21:15 UTC (rev 10546)
@@ -0,0 +1,57 @@
+digraph TableGraph {
+ compound=true;
+ bgcolor="white";
+ fontcolor="black"; fontname="Helvetica"; fontsize="10.0";
+ ranksep="equally";
+ label="Table Graph";
+ URL="http://tools.hibernate.org";
+ edge [
+ color="lightgrey",
+ fontcolor="black",
+ fontname="Helvetica",
+ fontsize="8.0",
+ labelangle=-25.0,
+ labeldistance=1.5
+ headport=nw,
+ tailport=se
+ ];
+ node [
+ fontcolor="black",
+ fontname="Helvetica",
+ fontsize="10.0",
+ shape=record,
+ fillcolor="yellow",
+ style="solid,filled"];
+
+/* TODO: multi schema tables */
+<#foreach table in cfg.getTableMappings()>
+ <#if table.isPhysicalTable()>
+ /* Node ${table.name} */
+ <@nodeName table/> [ label = "<@columnLabels name=table.name columns=table.columnIterator/>" ]
+
+ <@propertyEdges root=table.name?replace(".","_dot_") foreignKeys=table.foreignKeyIterator/>
+ </#if>
+</#foreach>
+
+}
+
+<#macro nodeName table>${table.name?replace(".","_dot_")}</#macro>
+
+<#macro columnLabels name columns>
+<@compress single_line=true>
+ {
+ ${name?replace(".","\\.")}|
+ <#foreach p in columns>
+ <${p.name}>${p.name}\l
+ <#if p_has_next>|</#if>
+ </#foreach>
+ }</@compress></#macro>
+
+<#macro propertyEdges root foreignKeys>
+ /* edges/nodes for ${root} */
+ <#foreach fk in foreignKeys>
+ ${root} -> <@nodeName fk.referencedTable/> [
+ label="${fk.name}"
+ ]
+ </#foreach>
+</#macro>
\ No newline at end of file
17 years, 6 months
Hibernate SVN: r10545 - trunk/HibernateExt/tools/doc/reference/en/modules
by hibernate-commits@lists.jboss.org
Author: max.andersen(a)jboss.com
Date: 2006-10-03 18:17:22 -0400 (Tue, 03 Oct 2006)
New Revision: 10545
Modified:
trunk/HibernateExt/tools/doc/reference/en/modules/plugins.xml
Log:
fix bad media object
Modified: trunk/HibernateExt/tools/doc/reference/en/modules/plugins.xml
===================================================================
--- trunk/HibernateExt/tools/doc/reference/en/modules/plugins.xml 2006-10-03 22:04:16 UTC (rev 10544)
+++ trunk/HibernateExt/tools/doc/reference/en/modules/plugins.xml 2006-10-03 22:17:22 UTC (rev 10545)
@@ -91,8 +91,7 @@
<mediaobject>
- <title>Creating a Hibernate Console configuration</title>
-
+
<imageobject role="fo">
<imagedata fileref="images/consolecfgwizard.gif" format="GIF" />
</imageobject>
@@ -102,6 +101,7 @@
fileref="../shared/images/consolecfgwizard.gif"
format="GIF" />
</imageobject>
+ <caption>Creating a Hibernate Console configuration</caption>
</mediaobject>
@@ -264,8 +264,7 @@
- <mediaobject>
- <title>Console overview</title>
+ <mediaobject>
<imageobject role="fo">
<imagedata align="center"
@@ -278,6 +277,8 @@
fileref="../shared/images/consoleoutline-before-reveng.gif"
format="GIF" />
</imageobject>
+
+ <caption>Console overview</caption>
</mediaobject>
17 years, 6 months
Hibernate SVN: r10544 - in trunk/HibernateExt/metadata/src: java/org/hibernate/cfg java/org/hibernate/cfg/annotations test/org/hibernate/test/annotations/indexcoll
by hibernate-commits@lists.jboss.org
Author: epbernard
Date: 2006-10-03 18:04:16 -0400 (Tue, 03 Oct 2006)
New Revision: 10544
Modified:
trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java
trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/Ejb3Column.java
trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/ExtendedMappings.java
trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/CollectionBinder.java
trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/indexcoll/Atmosphere.java
trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/indexcoll/IndexedCollectionTest.java
Log:
Activate ANN-408
Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java
===================================================================
--- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java 2006-10-03 21:03:01 UTC (rev 10543)
+++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java 2006-10-03 22:04:16 UTC (rev 10544)
@@ -1773,11 +1773,7 @@
path, mappings
);
if (inSecondPass) {
- //throw new NotYetImplementedException("inSecondPass waiting for core > 3.2.0.cr4");
- //secondPass.doSecondPass( mappings.getClasses() );
- mappings.addSecondPass(
- secondPass
- );
+ secondPass.doSecondPass( mappings.getClasses() );
}
else {
mappings.addSecondPass(
@@ -1894,11 +1890,7 @@
optional, cascadeStrategy, joinColumns, mappings
);
if (inSecondPass) {
- //throw new NotYetImplementedException("inSecondPass waiting for core > 3.2.0.cr4");
- //secondPass.doSecondPass( mappings.getClasses() );
- mappings.addSecondPass(
- secondPass
- );
+ secondPass.doSecondPass( mappings.getClasses() );
}
else {
mappings.addSecondPass(
Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/Ejb3Column.java
===================================================================
--- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/Ejb3Column.java 2006-10-03 21:03:01 UTC (rev 10543)
+++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/Ejb3Column.java 2006-10-03 22:04:16 UTC (rev 10544)
@@ -433,11 +433,7 @@
if ( index == null ) return;
IndexSecondPass secondPass = new IndexSecondPass( index.name(), this, mappings );
if (inSecondPass) {
- //throw new NotYetImplementedException("inSecondPass waiting for core > 3.2.0.cr4");
- //secondPass.doSecondPass( mappings.getClasses() );
- mappings.addSecondPass(
- secondPass
- );
+ secondPass.doSecondPass( mappings.getClasses() );
}
else {
mappings.addSecondPass(
Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/ExtendedMappings.java
===================================================================
--- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/ExtendedMappings.java 2006-10-03 21:03:01 UTC (rev 10543)
+++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/ExtendedMappings.java 2006-10-03 22:04:16 UTC (rev 10544)
@@ -259,4 +259,8 @@
public void addSQLQuery(String name, NamedSQLQueryDefinition query) throws MappingException {
if ( ! defaultNamedNativeQueryNames.contains( name ) ) super.addSQLQuery( name, query );
}
+
+ public Map getClasses() {
+ return classes;
+ }
}
\ No newline at end of file
Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/CollectionBinder.java
===================================================================
--- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/CollectionBinder.java 2006-10-03 21:03:01 UTC (rev 10543)
+++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/CollectionBinder.java 2006-10-03 22:04:16 UTC (rev 10544)
@@ -68,7 +68,6 @@
import org.hibernate.mapping.Table;
import org.hibernate.reflection.XClass;
import org.hibernate.reflection.XProperty;
-import org.hibernate.util.CollectionHelper;
import org.hibernate.util.StringHelper;
/**
@@ -362,8 +361,8 @@
|| property.isAnnotationPresent( CollectionOfElements.class ) ) {
// do it right away, otherwise @ManyToon on composite element call addSecondPass
// and raise a ConcurrentModificationException
- sp.doSecondPass( CollectionHelper.EMPTY_MAP );
- //mappings.addSecondPass( sp, ! isMappedBy );
+ //sp.doSecondPass( CollectionHelper.EMPTY_MAP );
+ mappings.addSecondPass( sp, ! isMappedBy );
}
else {
mappings.addSecondPass( sp, ! isMappedBy );
Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/indexcoll/Atmosphere.java
===================================================================
--- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/indexcoll/Atmosphere.java 2006-10-03 21:03:01 UTC (rev 10543)
+++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/indexcoll/Atmosphere.java 2006-10-03 22:04:16 UTC (rev 10544)
@@ -34,11 +34,9 @@
@JoinTable(name = "Gas_per_key")
public Map<GasKey, Gas> gasesPerKey = new HashMap<GasKey, Gas>();
- /**
@CollectionOfElements
@Column(name="composition_rate")
@MapKeyManyToMany(joinColumns = @JoinColumn(name="gas_id"))
@JoinTable(name = "Composition", joinColumns = @JoinColumn(name = "atmosphere_id"))
public Map<Gas, Double> composition = new HashMap<Gas, Double>();
- */
}
Modified: trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/indexcoll/IndexedCollectionTest.java
===================================================================
--- trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/indexcoll/IndexedCollectionTest.java 2006-10-03 21:03:01 UTC (rev 10543)
+++ trunk/HibernateExt/metadata/src/test/org/hibernate/test/annotations/indexcoll/IndexedCollectionTest.java 2006-10-03 22:04:16 UTC (rev 10544)
@@ -395,6 +395,25 @@
s.close();
}
+ public void testEntityKeyElementTarget() throws Exception {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ Atmosphere atm = new Atmosphere();
+ Gas o2 = new Gas();
+ o2.name = "oxygen";
+ atm.composition.put( o2, 94.3 );
+ s.persist( o2 );
+ s.persist( atm );
+ s.flush();
+ s.clear();
+
+ atm = (Atmosphere) s.get( Atmosphere.class, atm.id );
+ assertEquals( 1, atm.composition.size() );
+ assertEquals( o2.name, atm.composition.keySet().iterator().next().name );
+ tx.rollback();
+ s.close();
+ }
+
public void testSortedMap() {
Session s = openSession();
Transaction tx = s.beginTransaction();
17 years, 6 months
Hibernate SVN: r10543 - trunk/HibernateExt/metadata/doc/reference/en/modules
by hibernate-commits@lists.jboss.org
Author: epbernard
Date: 2006-10-03 17:03:01 -0400 (Tue, 03 Oct 2006)
New Revision: 10543
Modified:
trunk/HibernateExt/metadata/doc/reference/en/modules/entity.xml
Log:
undupe
Modified: trunk/HibernateExt/metadata/doc/reference/en/modules/entity.xml
===================================================================
--- trunk/HibernateExt/metadata/doc/reference/en/modules/entity.xml 2006-10-03 00:19:06 UTC (rev 10542)
+++ trunk/HibernateExt/metadata/doc/reference/en/modules/entity.xml 2006-10-03 21:03:01 UTC (rev 10543)
@@ -1110,17 +1110,6 @@
<literal>Customer</literal> table materialized by the
<literal>joinColumns</literal> attribute.</para>
- <para>The association may be bidirectional. In a bidirectional
- relationship, one of the sides (and only one) has to be the owner: the
- owner is responsible for the association column(s) update. To declare
- a side as <emphasis>not</emphasis> responsible for the relationship,
- the attribute <literal>mappedBy</literal> is used.
- <literal>mappedBy</literal> refers to the property name of the
- association on the owner side. In our case, this is
- <literal>passport</literal>. As you can see, you don't have to (must
- not) declare the join column since it has already been declared on the
- owners side.</para>
-
<para>You must declare the join table name and the join columns
explicitly in such a mapping.</para>
</sect3>
17 years, 6 months
Hibernate SVN: r10542 - trunk/HibernateExt/metadata/src/java/org/hibernate/cfg
by hibernate-commits@lists.jboss.org
Author: epbernard
Date: 2006-10-02 20:19:06 -0400 (Mon, 02 Oct 2006)
New Revision: 10542
Modified:
trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java
Log:
better exception message
Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java
===================================================================
--- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java 2006-10-02 18:27:05 UTC (rev 10541)
+++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/AnnotationBinder.java 2006-10-03 00:19:06 UTC (rev 10542)
@@ -942,8 +942,10 @@
List<XProperty> properties = annotatedClass.getDeclaredProperties( accessType );
for ( XProperty p : properties ) {
if ( !p.isTypeResolved() && !discoverTypeWithoutReflection( p ) && !mustBeSkipped( p, mappings ) ) {
- throw new IllegalStateException(
- "Property " + p + " has an unbound type and no explicit target entity."
+ throw new AnnotationException(
+ "Property " + StringHelper.qualify( propertyHolder.getEntityName(), p.getName() ) +
+ " has an unbound type and no explicit target entity. Resolve this Generic usage issue" +
+ " or set an explicit target attribute (eg @OneToMany(target=) or use an explicit @Type"
);
}
final boolean currentHasIdentifier = addProperty( p, elements, localPropertyAccessor, mappings );
17 years, 6 months
Hibernate SVN: r10541 - in branches/Branch_3_2/Hibernate3/doc/reference/fr: . modules
by hibernate-commits@lists.jboss.org
Author: AnthonyHib
Date: 2006-10-02 14:27:05 -0400 (Mon, 02 Oct 2006)
New Revision: 10541
Modified:
branches/Branch_3_2/Hibernate3/doc/reference/fr/master.xml
branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/architecture.xml
branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/basic_mapping.xml
branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/batch.xml
branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/configuration.xml
branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/events.xml
branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/persistent_classes.xml
branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/query_hql.xml
branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/query_sql.xml
branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/session_api.xml
branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/transactions.xml
branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/tutorial.xml
Log:
update for 3.2 doc compliance
Modified: branches/Branch_3_2/Hibernate3/doc/reference/fr/master.xml
===================================================================
--- branches/Branch_3_2/Hibernate3/doc/reference/fr/master.xml 2006-10-02 18:02:18 UTC (rev 10540)
+++ branches/Branch_3_2/Hibernate3/doc/reference/fr/master.xml 2006-10-02 18:27:05 UTC (rev 10541)
@@ -33,7 +33,7 @@
<bookinfo>
<title>HIBERNATE - Persistance relationnelle en Java standard</title>
<subtitle>Documentation de r�f�rence d'Hibernate</subtitle>
- <releaseinfo>3.1final</releaseinfo>
+ <releaseinfo>3.2final</releaseinfo>
</bookinfo>
<toc/>
Modified: branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/architecture.xml
===================================================================
--- branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/architecture.xml 2006-10-02 18:02:18 UTC (rev 10540)
+++ branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/architecture.xml 2006-10-02 18:27:05 UTC (rev 10541)
@@ -270,7 +270,7 @@
</para>
</sect1>
- <sect1 id="architecture-current-session" revision="1">
+ <sect1 id="architecture-current-session" revision="2">
<title>Sessions Contextuelles</title>
<para>
Certaines applications utilisant Hibernate ont besoin d'une sorte de session "contextuelle", o�
@@ -321,6 +321,14 @@
courantes sont associ�es au thread d'ex�cution. Voir les javadocs pour les d�tails.
</para>
</listitem>
+ <listitem>
+ <para>
+ <literal>org.hibernate.context.ManagedSessionContext</literal> - les sessions
+ courantes sont traqu�es par l'ex�cution du thread. Toutefois, vous �tes responsable
+ de lier et d�lier une instance de <literal>Session</literal> avec les m�thodes
+ statiques de cette classes, qui n'ouvre, ne flush ou ne ferme jamais de <literal>Session</literal>.
+ </para>
+ </listitem>
</itemizedlist>
<para>
Modified: branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/basic_mapping.xml
===================================================================
--- branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/basic_mapping.xml 2006-10-02 18:02:18 UTC (rev 10540)
+++ branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/basic_mapping.xml 2006-10-02 18:27:05 UTC (rev 10541)
@@ -86,7 +86,8 @@
qui agissent sur le sch�ma de base de donn�es export� par l'outil de
g�n�ration de sch�ma. (Par exemple l'attribut <literal>not-null</literal>.)
</para>
- <sect2 id="mapping-declaration-doctype" revision="2">
+
+ <sect2 id="mapping-declaration-doctype" revision="3">
<title>Doctype</title>
<para>
Tous les mappings XML devraient utiliser le doctype indiqu�.
@@ -96,6 +97,56 @@
des recherches de la DTD sur Internet, v�rifiez votre d�claration de DTD par rapport
au contenu de votre classpath.
</para>
+
+ <sect3 id="mapping-declaration-entity-resolution">
+ <title>EntityResolver</title>
+ <para>
+ Comme cit� pr�c�demment, Hibernate tentera de trouver les DTDs d'abord dans son classpath. Il
+ r�ussit � faire cela en utilisant une impl�mentation particuli�re de <literal>org.xml.sax.EntityResolver</literal>
+ avec le SAXReader qu'il utilise pour lire les fichiers xml. Cet <literal>EntityResolver</literal> particulier
+ reconnait deux espaces de nommage systemId diff�rents.
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ un <literal>espace de nommage hibernate</literal> est reconnu d�s qu'un systemId commence par
+ <literal>http://hibernate.sourceforge.net/</literal>; alors ces entit�s sont r�solues via le
+ classloader qui a charg� les classes Hibernate.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ un <literal>espace de nommage utilisateur</literal> est reconnu d�s qu'un systemId utilise
+ un protocol URL <literal>classpath://</literal>. Le r�solveur tentera de r�soudre ces entit�s
+ via (1) le classloader du contexte du thread courant et (2) le classloader qui a charg�
+ les classes Hibernate.
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ Un exemple d'utilisation de l'espace de nommage utilisateur:
+ </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>
+ O� <literal>types.xml</literal> est une ressource dans le package <literal>your.domain</literal>
+ et qui contient un <xref linkend="mapping-types-custom">typedef</xref> particulier.
+ </para>
+ </sect3>
+
</sect2>
<sect2 id="mapping-declaration-mapping" revision="3">
<title>hibernate-mapping</title>
@@ -1103,7 +1154,7 @@
utilisent des identifiants assign�s ou des clefs compos�es !</emphasis>
</para>
</sect2>
- <sect2 id="mapping-declaration-timestamp" revision="3" >
+ <sect2 id="mapping-declaration-timestamp" revision="4" >
<title>timestamp (optionnel)</title>
<para>
L'�l�ment optionnel <literal><timestamp></literal> indique que la table contient des donn�es
@@ -1179,7 +1230,9 @@
</programlistingco>
<para>
Notez que <literal><timestamp></literal> est �quivalent �
- <literal><version type="timestamp"></literal>.
+ <literal><version type="timestamp"></literal> et
+ <literal><timestamp source="db"></literal> �quivaut �
+ <literal><version type="dbtimestamp"></literal>.
</para>
</sect2>
<sect2 id="mapping-declaration-property" revision="4">
Modified: branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/batch.xml
===================================================================
--- branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/batch.xml 2006-10-02 18:02:18 UTC (rev 10540)
+++ branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/batch.xml 2006-10-02 18:27:05 UTC (rev 10541)
@@ -33,6 +33,12 @@
<programlisting><![CDATA[hibernate.jdbc.batch_size 20]]></programlisting>
+ <para id="disablebatching" revision="1">
+ Notez qu'Hibernate d�sactive, de mani�re transparente, l'insertion par paquet au
+ niveau JDBC si vous utilisez un g�n�rateur d'identifiant de type
+ <literal>identity</literal>.
+ </para>
+
<para>
Vous pourriez aussi vouloir faire cette sorte de travail dans un traitement o�
l'interaction avec le cache de second niveau est compl�tement d�sactiv� :
@@ -150,7 +156,7 @@
</sect1>
- <sect1 id="batch-direct" revision="2">
+ <sect1 id="batch-direct" revision="3">
<title>Op�rations de style DML</title>
<para>
@@ -218,10 +224,34 @@
session.close();]]></programlisting>
<para>
- Pour ex�cuter un <literal>DELETE</literal> HQL, utilisez la m�me m�thode
- <literal>Query.executeUpdate()</literal> :
+ Par d�faut, les statements HQL <literal>UPDATE</literal>, n'affectent pas la valeur des propri�t�s
+ <xref linkend="mapping-declaration-version">version</xref> ou
+ <xref linkend="mapping-declaration-timestamp">timestamp</xref>
+ pour les entit�s affect�es; ceci est compatible avec la spec EJB3. Toutefois,
+ vous pouvez forcer Hibernate � mettre � jour les valeurs des propri�t�s
+ <literal>version</literal> ou <literal>timestamp</literal> en utilisant le <literal>versioned update</literal>.
+ Pour se faire, ajoutez le mot cl� <literal>VERSIONED</literal> apr�s le mot cl� <literal>UPDATE</literal>.
</para>
+<programlisting><![CDATA[Session session = sessionFactory.openSession();
+Transaction tx = session.beginTransaction();
+String hqlVersionedUpdate = "update versioned Customer set name = :newName where name = :oldName";
+int updatedEntities = s.createQuery( hqlUpdate )
+ .setString( "newName", newName )
+ .setString( "oldName", oldName )
+ .executeUpdate();
+tx.commit();
+session.close();]]></programlisting>
+
+ <para>
+ Notez que les types personnalis�s (<literal>org.hibernate.usertype.UserVersionType</literal>)
+ ne sont pas support�s en conjonction avec le statement <literal>update versioned</literal> statement.
+ </para>
+
+ <para>
+ Pour ex�cuter un HQL <literal>DELETE</literal>, utilisez la m�me m�thode<literal>Query.executeUpdate()</literal>:
+ </para>
+
<programlisting><![CDATA[Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
Modified: branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/configuration.xml
===================================================================
--- branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/configuration.xml 2006-10-02 18:02:18 UTC (rev 10540)
+++ branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/configuration.xml 2006-10-02 18:27:05 UTC (rev 10541)
@@ -938,7 +938,7 @@
</tgroup>
</table>
- <table frame="topbot" id="configuration-misc-properties" revision="9">
+ <table frame="topbot" id="configuration-misc-properties" revision="10">
<title>Propri�t�s diverses</title>
<tgroup cols="2">
<colspec colname="c1" colwidth="1*"/>
@@ -962,7 +962,7 @@
<para>
<emphasis role="strong">eg.</emphasis>
<literal>jta</literal> | <literal>thread</literal> |
- <literal>custom.Class</literal>
+ <literal>managed</literal> | <literal>custom.Class</literal>
</para>
</entry>
</row>
Modified: branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/events.xml
===================================================================
--- branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/events.xml 2006-10-02 18:02:18 UTC (rev 10540)
+++ branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/events.xml 2006-10-02 18:27:05 UTC (rev 10541)
@@ -8,7 +8,7 @@
fonctionnalit�s g�n�riques, et d'extensions de fonctionnalit�s d'Hibernate.
</para>
- <sect1 id="objectstate-interceptors" revision="2">
+ <sect1 id="objectstate-interceptors" revision="3">
<title>Intercepteurs</title>
<para>
@@ -115,21 +115,32 @@
}]]></programlisting>
<para>
- L'intercepteur doit �tre sp�cifi� quand une session est cr��e.
+ Il y a deux types d'intercepteurs: li� � la <literal>Session</literal> et
+ li� � la <literal>SessionFactory</literal>.
</para>
+ <para>
+ Un intercepteur li� � la <literal>Session</literal> est d�fini
+ lorsqu'une session est ouverte via l'invocation des m�thodes surcharg�es SessionFactory.openSession()
+ acceptant un <literal>Interceptor</literal> (comme argument).
+ </para>
<programlisting><![CDATA[Session session = sf.openSession( new AuditInterceptor() );]]></programlisting>
<para>
- Vous pouvez aussi mettre un intercepteur au niveau global, en utilisant l'objet <literal>Configuration</literal>.
- Dans ce cas, l'intercepteur doit �tre "threadsafe".
+ Un intercepteur li� a <literal>SessionFactory</literal> est d�fini avec l'objet <literal>Configuration</literal>
+ avant la construction de la <literal>SessionFactory</literal>. Dans ce cas, les intercepteurs fournis seront
+ appliqu�s � toutes les sessions ouvertes pour cette <literal>SessionFactory</literal>; ceci est vrai
+ � moins que la session ne soit ouverte en sp�cifiant l'intercepteur � utiliser.
+ Les intercepteurs li�s � la <literal>SessionFactory</literal> doivent �tre thread safe, faire attention
+ � ne pas stocker des �tats sp�cifiques de la session puisque plusieurs sessions peuvent utiliser
+ l'intercepteur de mani�re concurrente.
</para>
<programlisting><![CDATA[new Configuration().setInterceptor( new AuditInterceptor() );]]></programlisting>
</sect1>
- <sect1 id="objectstate-events" revision="3">
+ <sect1 id="objectstate-events" revision="4">
<title>Syst�me d'�v�nements</title>
<para>
Modified: branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/persistent_classes.xml
===================================================================
--- branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/persistent_classes.xml 2006-10-02 18:02:18 UTC (rev 10540)
+++ branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/persistent_classes.xml 2006-10-02 18:27:05 UTC (rev 10541)
@@ -6,7 +6,7 @@
Les classes persistantes sont les classes d'une application qui impl�mentent
les entit�s d'un probl�me m�tier (ex. Client et Commande dans une application
de commerce �lectronique).
- Toutes les instances d'une classe persistante ne sont pas forc�ment
+ Toutes les instances d'une classe persistante ne sont pas forc�ment
dans l'�tat persistant - au lieu de cela, une instance peut �tre �ph�m�re (NdT : transient) ou d�tach�e.
</para>
@@ -116,7 +116,7 @@
<para>
<literal>Cat</literal> a un constructeur sans argument. Toutes les classes persistantes doivent avoir un
constructeur par d�faut (lequel peut ne pas �tre public) pour qu'Hibernate puissent les instancier en utilisant
- <literal>Constructor.newInstance()</literal>. Nous recommandons fortement d'avoir un constructeur par d�faut avec
+ <literal>Constructor.newInstance()</literal>. Nous recommandons fortement d'avoir un constructeur par d�faut avec
au moins une visibilit� <emphasis>paquet</emphasis> pour la g�n�ration du proxy � l'ex�cution dans Hibernate.
</para>
</sect2>
@@ -148,7 +148,7 @@
<itemizedlist spacing="compact">
<listitem>
<para>
- Les r�attachements transitifs pour les objets d�tach�s (mise � jour en cascade ou fusion en cascade) -
+ Les r�attachements transitifs pour les objets d�tach�s (mise � jour en cascade ou fusion en cascade) -
voir <xref linkend="objectstate-transitive"/>
</para>
</listitem>
@@ -270,13 +270,13 @@
en comparant la valeur de l'identifiant des deux objets. Si cette valeur est identique, les deux
doivent repr�senter la m�me ligne de base de donn�es, ils sont donc �gaux (si les deux sont
ajout�s � un <literal>Set</literal>, nous n'aurons qu'un seul �l�ment dans le
- <literal>Set</literal>). Malheureusement, nous ne pouvons pas utiliser cette approche avec
+ <literal>Set</literal>). Malheureusement, nous ne pouvons pas utiliser cette approche avec
des identifiants g�n�r�s ! Hibernate n'assignera de
valeur d'identifiant qu'aux objets qui sont persistants, une instance nouvellement cr��e n'aura
donc pas de valeur d'identifiant ! De plus, si une instance est non sauvegard�e et actuellement dans un <literal>Set</literal>,
le sauvegarder assignera une valeur d'identifiant � l'objet. Si <literal>equals()</literal> et <literal>hashCode()</literal>
- sont bas�es sur la valeur de l'identifiant, le code de hachage devrait changer, rompant le contrat du <literal>Set</literal>.
- Regardez sur le site web d'Hibernate pour une discussion compl�te de ce probl�me.
+ sont bas�es sur la valeur de l'identifiant, le code de hachage devrait changer, rompant le contrat du <literal>Set</literal>.
+ Regardez sur le site web d'Hibernate pour une discussion compl�te de ce probl�me.
Notez que ceci n'est pas un probl�me d'Hibernate, mais la s�mantique normale de Java pour l'identit� d'un objet et l'�galit�.
</para>
@@ -314,7 +314,7 @@
}]]></programlisting>
<para>
- Notez qu'une clef m�tier ne doit pas �tre solide comme une clef primaire de base de donn�es
+ Notez qu'une clef m�tier ne doit pas �tre solide comme une clef primaire de base de donn�es
(voir <xref linkend="transactions-basics-identity"/>). Les propri�t�s
immuables ou uniques sont g�n�ralement de bonnes candidates pour une clef m�tier.
</para>
@@ -461,7 +461,7 @@
</sect1>
- <sect1 id="persistent-classes-tuplizers" revision="0">
+ <sect1 id="persistent-classes-tuplizers" revision="1">
<title>Tuplizers</title>
<para>
@@ -473,7 +473,7 @@
une telle structure de donn�es. Par exemple, pour le mode d'entit� POJO, le tuplizer correspondant
sait comment cr�er le POJO � travers son constructeur et comment acc�der aux propri�t�s du POJO
utilisant les accesseurs de la propri�t� d�finie. Il y a deux types de Tuplizers haut niveau,
- repr�sent� par les interfaces <literal>org.hibernate.tuple.EntityTuplizer</literal> et
+ repr�sent�s par les interfaces <literal>org.hibernate.tuple.EntityTuplizer</literal> et
<literal>org.hibernate.tuple.ComponentTuplizer</literal>. Les <literal>EntityTuplizer</literal>s
sont responsables de la gestion des contrats mentionn�s ci-dessus pour les entit�s, alors que
les <literal>ComponentTuplizer</literal>s s'occupent des composants.
@@ -509,7 +509,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: branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/query_hql.xml
===================================================================
--- branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/query_hql.xml 2006-10-02 18:02:18 UTC (rev 10540)
+++ branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/query_hql.xml 2006-10-02 18:27:05 UTC (rev 10541)
@@ -42,8 +42,8 @@
<programlisting><![CDATA[from eg.Cat]]></programlisting>
<para>
- qui retourne simplement toutes les instances de la classe <literal>eg.Cat</literal>.
- Nous n'avons pas besoin d'habitude de qualifier le nom de la classe,
+ qui retourne simplement toutes les instances de la classe <literal>eg.Cat</literal>.
+ Nous n'avons pas besoin d'habitude de qualifier le nom de la classe,
puisque <literal>auto-import</literal> est la valeur par d�faut. Donc nous �crivons presque toujours :
</para>
@@ -80,7 +80,7 @@
</sect1>
- <sect1 id="queryhql-joins" revision="1">
+ <sect1 id="queryhql-joins" revision="2">
<title>Associations et jointures</title>
<para>
@@ -158,7 +158,7 @@
Une jointure "fetch�e" (rapport�e) n'a g�n�ralement pas besoin de se voir assigner
un alias puisque les objets associ�s n'ont pas � �tre utilis�s dans les autres clauses.
Notez aussi que les objets associ�s ne sont pas retourn�s directement dans le r�sultat de
- la requ�te mais l'on peut y acc�der via l'objet parent. La seule raison pour laquelle nous
+ la requ�te mais l'on peut y acc�der via l'objet parent. La seule raison pour laquelle nous
pourrions avoir besoin d'un alias est si nous r�cup�rions r�cursivement une collection suppl�mentaire :
</para>
@@ -171,17 +171,18 @@
Notez que la construction de <literal>fetch</literal> ne peut pas �tre utilis�e dans les requ�tes appel�es par
<literal>scroll()</literal> ou <literal>iterate()</literal>.
<literal>fetch</literal> ne devrait pas non plus �tre utilis� avec <literal>setMaxResults()</literal> ou
- <literal>setFirstResult()</literal>. <literal>fetch</literal> ne peut pas non plus �tre utilis� avec une
- condition <literal>with</literal> ad hoc. Il est
- possible de cr�er un produit cart�sien par jointure en r�cup�rant plus d'une collection dans une requ�te,
- donc faites attention dans ce cas. R�cup�rer par jointure de multiples collections donne aussi parfois
+ <literal>setFirstResult()</literal>, ces op�rations �tant bas�es sur le nombre de r�sultats qui contient
+ g�n�ralement des doublons d�s que des collections sont charg�es.
+ <literal>fetch</literal> ne peut pas non plus �tre utilis� avec une condition <literal>with</literal> ad hoc. Il est
+ possible de cr�er un produit cart�sien par jointure en r�cup�rant plus d'une collection dans une requ�te,
+ donc faites attention dans ce cas. R�cup�rer par jointure de multiples collections donne aussi parfois
des r�sultats inattendus pour des mappings de bag, donc soyez prudent lorsque vous formulez vos requ�tes dans de tels cas.
Finalement, notez que <literal>full join fetch</literal> et <literal>right join fetch</literal> ne sont pas utiles en g�n�ral.
</para>
<para>
- Si vous utilisez un chargement retard� pour les propri�t�s (avec une instrumentation par bytecode), il est possible
- de forcer Hibernate � r�cup�rer les propri�t�s non encore charg�es imm�diatement (dans la premi�re requ�te)
+ Si vous utilisez un chargement retard� pour les propri�t�s (avec une instrumentation par bytecode), il est possible
+ de forcer Hibernate � r�cup�rer les propri�t�s non encore charg�es imm�diatement (dans la premi�re requ�te)
en utilisant <literal>fetch all properties</literal>.
</para>
@@ -189,7 +190,7 @@
<programlisting><![CDATA[from Document doc fetch all properties where lower(doc.name) like '%cats%']]></programlisting>
</sect1>
-
+
<sect1 id="queryhql-joins-forms">
<title>Formes de syntaxes pour les jointures</title>
@@ -198,14 +199,14 @@
</para>
<para>
- Les requ�tes pr�sentes dans la section pr�c�dente utilisent la forme <literal>explicite</literal>
+ Les requ�tes pr�sentes dans la section pr�c�dente utilisent la forme <literal>explicite</literal>
o� le mode cl� join est explicitement utilis� dans la clause from. C'est la forme recommand�e.
</para>
<para>
La forme <literal>implicite</literal> n'utilise pas le mot cl� join.
A la place, les associations sont "d�r�f�renc�es" en utilisant le notation '.'. Ces
- jointures peuvent apparaitre dans toutes les clauses. Les jointures <literal>implicites</literal>
+ jointures peuvent apparaitre dans toutes les clauses. Les jointures <literal>implicites</literal>
r�sultent en des inner join dans le SQL g�n�r�.
</para>
@@ -398,7 +399,7 @@
<title>La clause where</title>
<para>
- La clause <literal>where</literal> vous permet de r�duire la liste des instances retourn�es.
+ La clause <literal>where</literal> vous permet de r�duire la liste des instances retourn�es.
Si aucun alias n'existe, vous pouvez vous r�f�rer aux propri�t�s par leur nom :
</para>
@@ -614,7 +615,7 @@
<listitem>
<para>
Les fonctions HQL qui s'appliquent expressions repr�sentant des collections : <literal>size(),
- minelement(), maxelement(), minindex(), maxindex()</literal>, ainsi que les fonctions sp�ciales <literal>elements()</literal>
+ minelement(), maxelement(), minindex(), maxindex()</literal>, ainsi que les fonctions sp�ciales <literal>elements()</literal>
et <literal>indices</literal> qui peuvent �tre quantifi�es en utilisant <literal>some, all, exists, any, in</literal>.
</para>
</listitem>
@@ -822,11 +823,11 @@
</para>
</sect1>
- <sect1 id="queryhql-grouping">
+ <sect1 id="queryhql-grouping" revision="1">
<title>La clause group by</title>
<para>
- Si la requ�te retourne des valeurs aggr�g�es, celles ci peuvent �tre group�es par propri�t� ou composant :
+ Si la requ�te retourne des valeurs aggr�g�es, celles-ci peuvent �tre group�es par propri�t� d'une classe retourn�e ou par composant :
</para>
<programlisting><![CDATA[select cat.color, sum(cat.weight), count(cat)
@@ -847,20 +848,24 @@
having cat.color in (eg.Color.TABBY, eg.Color.BLACK)]]></programlisting>
<para>
- Les fonctions SQL et les fonctions d'aggr�gations sont permises dans les clauses <literal>having</literal>
- et <literal>order by</literal>, si elles sont support�es par la base de donn�es (ce que ne fait pas MySQL par exemple).
+ Les fonctions SQL et les fonctions d'agr�gat sont permises dans les clauses <literal>having</literal>
+ et <literal>order by</literal>, si elles sont prises en charge par la base de donn�es (ce que ne fait pas MySQL par exemple).
</para>
<programlisting><![CDATA[select cat
from Cat cat
join cat.kittens kitten
-group by cat
+group by cat.id, cat.name, cat.other, cat.properties
having avg(kitten.weight) > 100
order by count(kitten) asc, sum(kitten.weight) desc]]></programlisting>
<para>
Notez que ni la clause <literal>group by</literal> ni la clause
<literal>order by</literal> ne peuvent contenir d'expressions arithm�tiques.
+ Notez aussi qu'Hibernate ne d�veloppe pas une entit� faisant partie du regroupement,
+ donc vous ne pouvez pas �crire <literal>group by cat</literal> si toutes
+ les propri�t�s de <literal>cat</literal> sont non-agr�g�es. Vous devez
+ lister toutes les propri�t�s non-agr�g�es explicitement.
</para>
</sect1>
@@ -912,7 +917,7 @@
)]]></programlisting>
<para>
- Notez que sur certaines bases de donn�es (mais par Oracle ou HSQL), vous pouvez utiliser des constructeurs de tuples
+ Notez que sur certaines bases de donn�es (mais par Oracle ou HSQL), vous pouvez utiliser des constructeurs de tuples
dans d'autres contextes, par exemple lors du requ�tage de composants ou de types utilisateur composites :
</para>
Modified: branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/query_sql.xml
===================================================================
--- branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/query_sql.xml 2006-10-02 18:02:18 UTC (rev 10540)
+++ branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/query_sql.xml 2006-10-02 18:27:05 UTC (rev 10541)
@@ -13,7 +13,7 @@
<para>Hibernate3 vous permet de sp�cifier du SQL �crit � la main (incluant les proc�dures stock�es)
pour toutes les op�rations de cr�ation, mise � jour, suppression et chargement.</para>
- <sect1 id="querysql-creating" revision="3">
+ <sect1 id="querysql-creating" revision="4">
<title>Utiliser une <literal>SQLQuery</literal></title>
<para>L'ex�cution des requ�tes en SQL natif est contr�l�e par l'interface <literal>SQLQuery</literal>,
@@ -21,224 +21,369 @@
Dans des cas extr�mement simples, nous pouvons utiliser la forme suivante :
</para>
- <programlisting>List cats = sess.createSQLQuery("select * from cats")
- .addEntity(Cat.class)
- .list();</programlisting>
+ <sect2>
+ <title>Requ�tes scalaires</title>
- <para>Cette requ�te a sp�cifi� :</para>
+ <para>La requ�te SQL la plus basique permet de r�cup�rer une liste de (valeurs) scalaires.</para>
- <itemizedlist>
- <listitem>
- <para>la requ�te SQL</para>
- </listitem>
+ <programlisting><![CDATA[sess.createSQLQuery("SELECT * FROM CATS").list();
+sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE FROM CATS").list();
+]]></programlisting>
- <listitem>
- <para>l'entit� retourn�e par la requ�te</para>
- </listitem>
- </itemizedlist>
+ <para>Ces deux requ�tes retourneront un tableau d'objets (Object[]) avec
+ les valeurs scalaires de chacune des colonnes de la table CATS.
+ Hibernate utilisera le ResultSetMetadata pour d�duire l'ordre et le type
+ des valeurs scalaires retourn�es.</para>
- <para>
- Ici, les noms de colonne des r�sultats sont suppos�s �tre les m�mes que les noms de colonne sp�cifi�s dans le
- document de mapping. Cela peut �tre probl�matique pour des requ�tes SQL qui joignent de multiple tables, puisque
- les m�mes noms de colonne peuvent appara�tre dans plus d'une table. La forme suivante n'est pas vuln�rable � la
- duplication des noms de colonne :
- </para>
+ <para>Pour �viter l'overhead li� � <literal>ResultSetMetadata</literal> ou simplement pour
+ �tre plus explicite dans ce qui est retourn�, vous pouvez utiliser <literal>addScalar()</literal>.</para>
- <programlisting>List cats = sess.createSQLQuery("select {cat.*} from cats cat")
- .addEntity("cat", Cat.class)
- .list();</programlisting>
+ <programlisting><![CDATA[sess.createSQLQuery("SELECT * FROM CATS")
+ .addScalar("ID", Hibernate.LONG)
+ .addScalar("NAME", Hibernate.STRING)
+ .addScalar("BIRTHDATE", Hibernate.DATE)
+]]></programlisting>
- <para>Cette requ�te a sp�cifi� :</para>
+ <para>Cette requ�te sp�cifie:</para>
- <itemizedlist>
- <listitem>
- <para>la requ�te SQL, avec un param�tre fictif pour Hibernate pour injecter les alias de colonne</para>
- </listitem>
+ <itemizedlist>
+ <listitem>
+ <para>la cha�ne de caract�re SQL</para>
+ </listitem>
- <listitem>
- <para>l'entit� retourn�e par la requ�te, et son alias de table SQL</para>
- </listitem>
- </itemizedlist>
+ <listitem>
+ <para>les colonnes et les types retourn�s</para>
+ </listitem>
+ </itemizedlist>
- <para>
- La m�thode <literal>addEntity()</literal> associe l'alias de la table SQL
- avec la classe de l'entit� retourn�e, et d�termine la forme de l'ensemble des r�sultats de la requ�te.
- </para>
+ <para>Cela retournera toujours un tableau d'objets, mais sans utiliser le
+ <literal>ResultSetMetdata</literal>, mais r�cup�rera explicitement les colonnes
+ ID, NAME and BIRTHDATE column �tant de respectivement de type Long, String et Short,
+ depuis le resultset sous jacent. Cela signifie aussi que seules ces colonnes seront
+ retourn�es m�me si la requ�te utilise <literal>*</literal>
+ et aurait pu retourner plus que les trois colonnes list�es.</para>
- <para>
- La m�thode <literal>addJoin()</literal> peut �tre utilis�e pour charger des associations vers d'autres
- entit�s et collections.
- </para>
+ <para>Il est possible de ne pas d�finir l'information sur le type pour toutes ou partie
+ des calaires.</para>
- <programlisting>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>
+ <programlisting><![CDATA[sess.createSQLQuery("SELECT * FROM CATS")
+ .addScalar("ID", Hibernate.LONG)
+ .addScalar("NAME")
+ .addScalar("BIRTHDATE")
+]]></programlisting>
- <para>
- Une requ�te SQL native pourrait retourner une simple valeur scalaire ou une combinaison de scalaires et d'entit�s.
- </para>
+ <para>Il s'agit essentiellement de la m�me requ�te que pr�c�demment, mais
+ le <literal>ResultSetMetaData</literal> est utilis� pour d�cider des types de NAME
+ et BIRTHDATE alors que le type de ID est explicitement sp�cifi�.</para>
- <programlisting>Double max = (Double) sess.createSQLQuery("select max(cat.weight) as maxWeight from cats cat")
- .addScalar("maxWeight", Hibernate.DOUBLE);
- .uniqueResult();</programlisting>
+ <para>Les java.sql.Types retourn�s par le ResultSetMetaData sont mapp�s aux type Hibernate
+ via le Dialect. Si un type sp�cifique n'est pas mapp� ou est mapp� � un type non souhait�, il
+ est possible de personnaliser en invoquant <literal>registerHibernateType</literal> dans
+ le Dialect.</para>
+ </sect2>
- <para>Vous pouvez alternativement d�crire les informations de mapping des r�sultats dans vos fichiers hbm
- et les utiliser pour vos requ�tes.</para>
+ <sect2>
+ <title>Requ�tes d'entit�s</title>
- <programlisting>List cats = sess.createSQLQuery(
- "select {cat.*}, {kitten.*} from cats cat, cats kitten where kitten.mother = cat.id"
- )
- .setResultSetMapping("catAndKitten")
- .list();</programlisting>
- </sect1>
+ <para>Les requ�tes pr�c�dentes ne retournaient que des valeurs scalaires,
+ retournant basiquement que les valeurs brutes du resultset. Ce qui suit montre
+ comment r�cup�rer des entit�s depuis une requ�te native SQL, gr�ce �
+ <literal>addEntity()</literal>.</para>
- <sect1 id="querysql-aliasreferences">
- <title>Alias et r�f�rences de propri�t�</title>
+ <programlisting><![CDATA[sess.createSQLQuery("SELECT * FROM CATS").addEntity(Cat.class);
+sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE FROM CATS").addEntity(Cat.class);
+]]></programlisting>
- <para>
- La notation <literal>{cat.*}</literal> utilis�e au-dessus est un raccourci pour "toutes les propri�t�s".
- Alternativement, vous pouvez lister explicitement les colonnes, mais m�me ce cas que nous laissons � Hibernate
- injecte des alias de colonne SQL pour chaque propri�t�. Le rempla�ant pour un alias de colonne
- est juste le nom de la propri�t� qualifi� par l'alias de la table.
- Dans l'exemple suivant, nous r�cup�rons des <literal>Cat</literal>s � partir d'une table diff�rente
- (<literal>cat_log</literal>) de celle d�clar�e dans les m�ta-donn�es de mapping.
- Notez que nous pouvons m�me utiliser les alias de propri�t� dans la clause "where" si nous le souhaitons.
- </para>
+ <para>Cette requ�te sp�cifie:</para>
- <para>
- La syntaxe <literal>{}</literal> <emphasis>n'est pas</emphasis> requise pour le requ�tes nomm�es. Voir
- <xref linkend="querysql-namedqueries" />.
- </para>
+ <itemizedlist>
+ <listitem>
+ <para>La cha�ne de caract�re de requ�te SQL</para>
+ </listitem>
- <programlisting>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"
+ <listitem>
+ <para>L'entit� retourn�e par la requ�te</para>
+ </listitem>
+ </itemizedlist>
+ <para>Avec Cat mapp� comme classe avec les colonnes ID, NAME
+ et BIRTHDATE, les requ�tes pr�c�dentes retournent toutes deux une liste
+ o� chaque �l�ment est une entit� Cat.</para>
+
+ <para>Si l'entit� est mapp�e avec un <literal>many-to-one</literal> vers
+ une autre entit�, il est requis de retourner aussi cette entit� en ex�cutant
+ la requ�te native, sinon une erreur "column not found" sp�cifique � la base de
+ donn�es sera soulev�e. Les colonnes additionnelles seront automatiquement
+ retourn�es en utilisant la notation *, mais nous pr�f�rons �tre explicites
+ comme dans l'exemple suivant avec le <literal>many-to-one</literal> vers
+ <literal>Dog</literal>:</para>
+
+ <programlisting><![CDATA[sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE, DOG_ID FROM CATS").addEntity(Cat.class);
+]]></programlisting>
+
+ <para>Ceci permet � cat.getDog() de fonctionner normalement.</para>
+ </sect2>
+
+ <sect2>
+ <title>G�rer les associations et collections</title>
+
+ <para>Il est possible de charger agressivement <literal>Dog</literal> pour
+ �viter le chargement de proxy qui signifie aller retour suppl�mentaire vers
+ la base de donn�es. Ceci est faisable via la m�thode <literal>addJoin()</literal>,
+ qui vous permet de joindre une association ou collection.</para>
+
+ <programlisting><![CDATA[sess.createSQLQuery("SELECT c.ID, NAME, BIRTHDATE, DOG_ID, D_ID, D_NAME FROM CATS c, DOGS d WHERE c.DOG_ID = d.D_ID")
+ .addEntity("cat", Cat.class)
+ .addJoin("cat.dog");
+]]></programlisting>
+
+ <para>Dans cet exemple, les <literal>Cat</literal> retourn�s auront leur
+ propri�t� <literal>dog</literal> enti�rement initialis�es sans aucun aller/retour
+ suppl�mentaire vers la base de donn�es. Notez que nous avons ajout� un alias
+ ("cat") pour �tre capable de sp�cifier la propri�t� cible de la jointure.
+ Il est possible de faire la m�me jointure aggressive pour les collections, e.g. si le
+ <literal>Cat</literal> a un one-to-many vers <literal>Dog</literal>.</para>
+
+ <programlisting><![CDATA[sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE, D_ID, D_NAME, CAT_ID FROM CATS c, DOGS d WHERE c.ID = d.CAT_ID")
+ .addEntity("cat", Cat.class)
+ .addJoin("cat.dogs");
+]]></programlisting>
+
+ <p>Nous arrivons aux limites de ce qui est possible avec les requ�tes natives
+ sans les modifier pour les rendre utilisables par Hibernate; les probl�mes
+ surviennent lorsque nous essayons de retourner des entit�s du m�me type ou
+ lorsque les alias/colonnes par d�faut ne sont plus suffisants..</p>
+ </sect2>
+
+ <sect2>
+ <title>Retour d'entit�s multiples</title>
+
+ <para>Jusqu'� pr�sent, les colonnes du resultset sont suppos�es �tre les m�mes
+ que les colonnes sp�cifi�es dans les fichiers de mapping. Ceci peut
+ �tre probl�matique pour les requ�tes SQL qui effectuent de multiples
+ jointures vers diff�rentes tables, puisque les m�mes colonnes peuvent
+ appara�tre dans plus d'une table.</para>
+
+ <para>L'injection d'alias de colonne est requis pour la requ�te suivante
+ (qui risque de ne pas fonctionner):</para>
+
+ <programlisting><![CDATA[sess.createSQLQuery("SELECT c.*, m.* FROM CATS c, CATS m WHERE c.MOTHER_ID = c.ID")
+ .addEntity("cat", Cat.class)
+ .addEntity("mother", Cat.class)
+]]></programlisting>
+
+ <para>Le but de cette requ�te est de retourner deux instances de Cat par ligne,
+ un chat et sa m�re. Cela �chouera puisqu'il y a conflit de nom puisqu'ils sont
+ mapp�s au m�me nom de colonne et que sur certaines base de donn�es, les alias
+ de colonnes retourn�s seront plut�t de la forme
+ "c.ID", "c.NAME", etc. qui ne sont pas �gaux aux colonnes sp�cifi�es dans les
+ mappings ("ID" and "NAME").</para>
+
+ <para>La forme suivante n'est pas vuln�rable � la duplication des noms de colonnes:</para>
+
+ <programlisting><![CDATA[sess.createSQLQuery("SELECT {cat.*}, {mother.*} FROM CATS c, CATS m WHERE c.MOTHER_ID = c.ID")
+ .addEntity("cat", Cat.class)
+ .addEntity("mother", Cat.class)
+]]></programlisting>
+
+ <para>Cette requ�te sp�cifie:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>la requ�te SQL, avec des r�ceptacles pour qu'Hibernate injecte les alias de colonnes</para>
+ </listitem>
+
+ <listitem>
+ <para>les entit�s retourn�s par la requ�te</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>Les notations {cat.*} et {mother.*} utilis�es sont un �quivalent � 'toutes les propri�t�s'.
+ Alternativement, vous pouvez lister les colonnes explicitement, mais m�me pour ce cas, nous
+ laissons Hibernate injecter les alias de colonne pour chaque propri�t�.
+ Le r�ceptable pour un alias de colonne est simplement le nom de la propri�t�
+ qualifi� par l'alias de la table. Dans l'exemple suivant, nous r�cup�rons
+ les chats et leur m�re depuis une table diff�rentes (cat_log) de celle d�clar�e
+ dans les mappings. Notez que nous pouvons aussi utiliser les alias de propri�t�
+ dans la clause where si nous le voulons.</para>
+
+ <programlisting><![CDATA[String sql = "SELECT ID as {c.id}, NAME as {c.name}, " +
+ "BIRTHDATE as {c.birthDate}, MOTHER_ID as {c.mother}, {mother.*} " +
+ "FROM CAT_LOG c, CAT_LOG m WHERE {c.mother} = c.ID";
+
List loggedCats = sess.createSQLQuery(sql)
- .addEntity("cat", Cat.class)
- .setLong("catId", catId)
- .list();</programlisting>
+ .addEntity("cat", Cat.class)
+ .addEntity("mother", Cat.class).list()
+]]></programlisting>
+ <sect3 id="querysql-aliasreferences" revision="2">
+ <title>R�f�rences d'alias et de propri�t�</title>
- <para>
- <emphasis>� noter :</emphasis> si vous listez chaque propri�t� explicitement, vous devez inclure
- toutes les propri�t�s de la classe <emphasis>et ses sous-classes</emphasis> !
- </para>
+ <para>Pour la plupart des cas pr�c�dents, l'injection d'alias est requis,
+ mais pour les requ�tes relatives � des mappings plus complexes, comme
+ les propri�t�s composite, les discriminants d'h�ritage, les collections etc., il
+ y a des alias sp�cifiques � utiliser pour permettre � Hibernate l'injection
+ des bons alias.</para>
- <para>
- La table suivante montre les diff�rentes possibilit�s d'utilisation de l'injection d'alias. � noter : les noms
- des alias dans le r�sultat sont des exemples, chaque alias aura un nom unique et probablement diff�rent lors de l'utilisation.
- </para>
+ <para>Le tableau suivant montre les diverses possiblit�s d'utilisation
+ d'injection d'alias. Note: les noms d'alias dans le r�sultat sont des
+ exemples, chaque alias aura un nom unique et probablement diff�rent lorsqu'ils
+ seront utilis�s.</para>
- <table frame="topbot" id="aliasinjection-summary">
- <title>Noms d'injection d'alias</title>
+ <table frame="topbot" id="aliasinjection-summary">
+ <title>Nom d'injection d'alias</title>
- <tgroup cols="4">
- <colspec colwidth="1*" />
+ <tgroup cols="3">
+ <colspec colwidth="1*" />
- <colspec colwidth="1*" />
+ <colspec colwidth="1*" />
- <colspec colwidth="2.5*" />
+ <colspec colwidth="2.5*" />
- <thead>
- <row>
- <entry>Description</entry>
+ <thead>
+ <row>
+ <entry>Description</entry>
- <entry>Syntaxe</entry>
+ <entry>Syntaxe</entry>
- <entry>Exemple</entry>
- </row>
- </thead>
+ <entry>Exemple</entry>
+ </row>
+ </thead>
- <tbody>
- <row>
- <entry>Une simple propri�t�</entry>
+ <tbody>
+ <row>
+ <entry>Une propri�t� simple</entry>
- <entry><literal>{[aliasname].[propertyname]}</literal></entry>
+ <entry><literal>{[aliasname].[propertyname]</literal></entry>
- <entry><literal>A_NAME as {item.name}</literal></entry>
- </row>
+ <entry><literal>A_NAME as {item.name}</literal></entry>
+ </row>
- <row>
- <entry>Une propri�t� compos�e</entry>
+ <row>
+ <entry>Une propri�t� composite</entry>
- <entry><literal>{[aliasname].[componentname].[propertyname]}</literal></entry>
+ <entry><literal>{[aliasname].[componentname].[propertyname]}</literal></entry>
- <entry><literal>CURRENCY as {item.amount.currency}, VALUE as
- {item.amount.value}</literal></entry>
- </row>
+ <entry><literal>CURRENCY as {item.amount.currency}, VALUE as
+ {item.amount.value}</literal></entry>
+ </row>
- <row>
- <entry>Discriminant d'une entit�</entry>
+ <row>
+ <entry>Discriminateur d'une entit�</entry>
- <entry><literal>{[aliasname].class}</literal></entry>
+ <entry><literal>{[aliasname].class}</literal></entry>
- <entry><literal>DISC as {item.class}</literal></entry>
- </row>
+ <entry><literal>DISC as {item.class}</literal></entry>
+ </row>
- <row>
- <entry>Toutes les propri�t�s d'une entit�</entry>
+ <row>
+ <entry>Toutes les propri�t�s d'une entit�</entry>
- <entry><literal>{[aliasname].*}</literal></entry>
+ <entry><literal>{[aliasname].*}</literal></entry>
- <entry><literal>{item.*}</literal></entry>
- </row>
+ <entry><literal>{item.*}</literal></entry>
+ </row>
- <row>
- <entry>Une clef de collection</entry>
+ <row>
+ <entry>La cl� d'une collection</entry>
- <entry><literal>{[aliasname].key}</literal></entry>
+ <entry><literal>{[aliasname].key}</literal></entry>
- <entry><literal>ORGID as {coll.key}</literal></entry>
- </row>
+ <entry><literal>ORGID as {coll.key}</literal></entry>
+ </row>
- <row>
- <entry>L'identifiant d'une collection</entry>
+ <row>
+ <entry>L'id d'une collection</entry>
- <entry><literal>{[aliasname].id}</literal></entry>
+ <entry><literal>{[aliasname].id}</literal></entry>
- <entry><literal>EMPID as {coll.id}</literal></entry>
- </row>
+ <entry><literal>EMPID as {coll.id}</literal></entry>
+ </row>
- <row>
- <entry>L'�l�ment d'une collection</entry>
+ <row>
+ <entry>L'�l�ment d'une collection</entry>
- <entry><literal>{[aliasname].element}</literal></entry>
+ <entry><literal>{[aliasname].element}</literal></entry>
- <entry><literal>XID as {coll.element}</literal></entry>
+ <entry><literal>XID as {coll.element}</literal></entry>
+ </row>
- <entry></entry>
- </row>
+ <row>
+ <entry>Propri�t� d'un �l�ment de collection</entry>
- <row>
- <entry>Propri�t� de l'�l�ment dans la collection</entry>
+ <entry><literal>{[aliasname].element.[propertyname]}</literal></entry>
- <entry><literal>{[aliasname].element.[propertyname]}</literal></entry>
+ <entry><literal>NAME as {coll.element.name}</literal></entry>
+ </row>
- <entry><literal>NAME as {coll.element.name}</literal></entry>
- </row>
+ <row>
+ <entry>Toutes les propri�t�s d'un �l�ment de collection</entry>
- <row>
- <entry>Toutes les propri�t�s de l'�l�ment dans la collection</entry>
+ <entry><literal>{[aliasname].element.*}</literal></entry>
- <entry><literal>{[aliasname].element.*}</literal></entry>
+ <entry><literal>{coll.element.*}</literal></entry>
+ </row>
- <entry><literal>{coll.element.*}</literal></entry>
- </row>
+ <row>
+ <entry>Toutes les propri�t�s d'une collection</entry>
- <row>
- <entry>Toutes les propri�t�s de la collection</entry>
+ <entry><literal>{[aliasname].*}</literal></entry>
- <entry><literal>{[aliasname].*}</literal></entry>
+ <entry><literal>{coll.*}</literal></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </sect3>
+ </sect2>
+
+ <sect2>
+ <title>Retour d'objet n'�tant pas des entit�s</title>
- <entry><literal>{coll.*}</literal></entry>
- </row>
- </tbody>
- </tgroup>
- </table>
+ <para>Il est possible d'appliquer un ResultTransformer � une requ�te native SQL. Ce qui permet, par exemple, de
+ retourner des entit�s non g�r�es.</para>
+
+ <programlisting><![CDATA[sess.createSQLQuery("SELECT NAME, BIRTHDATE FROM CATS")
+ .setResultTransformer(Transformers.aliasToBean(CatDTO.class))]]></programlisting>
+
+ <para>Cette requ�te sp�cifie:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>une requ�te SQL</para>
+ </listitem>
+
+ <listitem>
+ <para>un transformateur de r�sultat</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ La requ�te pr�c�dente retournera une liste de <literal>CatDTO</literal> qui auront �t� instanci�s
+ et dans lesquelles les valeurs de NAME et BIRTHNAME auront �t� inject�es dans les propri�t�s ou champs
+ correspondants.
+ </para>
+ </sect2>
+
+ <sect2>
+ <title>G�rer l'h�ritage</title>
+
+ <para>Les requ�tes natives SQL pour les entit�s prenant part � un h�ritage
+ doivent inclure toutes les propri�t�s de la classe de base et de toutes
+ ses sous classes.</para>
+ </sect2>
+
+ <sect2>
+ <title>Param�tres</title>
+
+ <para>Les requ�tes natives SQL supportent aussi les param�tres nomm�s:</para>
+
+ <programlisting><![CDATA[Query query = sess.createSQLQuery("SELECT * FROM CATS WHERE NAME like ?").addEntity(Cat.class);
+List pusList = query.setString(0, "Pus%").list();
+
+query = sess.createSQLQuery("SELECT * FROM CATS WHERE NAME like :name").addEntity(Cat.class);
+List pusList = query.setString("name", "Pus%").list(); ]]></programlisting>
+ </sect2>
+
</sect1>
<sect1 id="querysql-namedqueries" revision="3">
Modified: branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/session_api.xml
===================================================================
--- branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/session_api.xml 2006-10-02 18:02:18 UTC (rev 10540)
+++ branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/session_api.xml 2006-10-02 18:27:05 UTC (rev 10541)
@@ -223,7 +223,7 @@
objets.
</para>
- <sect2 id="objectstate-querying-executing">
+ <sect2 id="objectstate-querying-executing" revision="1">
<title>Ex�cution de requ�tes</title>
<para>
@@ -251,8 +251,11 @@
Cat mother = (Cat) session.createQuery(
"select cat.mother from Cat as cat where cat = ?")
.setEntity(0, izi)
- .uniqueResult();]]></programlisting>
+ .uniqueResult();
+Query mothersWithKittens = (Cat) session.createQuery(
+ "select mother from Cat as mother left join fetch mother.kittens");
+Set uniqueMothers = new HashSet(mothersWithKittens.list());]]></programlisting>
<para>
Une requ�te est g�n�ralement ex�cut�e en invoquant <literal>list()</literal>,
le r�sultat de la requ�te sera charg�e compl�tement dans une collection en m�moire.
@@ -447,7 +450,7 @@
</sect3>
- <sect3 id="objectstate-querying-executing-named">
+ <sect3 id="objectstate-querying-executing-named" revision="1">
<title>Externaliser des requ�tes nomm�es</title>
<para>
@@ -476,6 +479,15 @@
utilis�, vous pouvez aussi d�finir des requ�tes SQL nativez dans les m�ta-donn�es, ou
migrer des requ�tes existantes vers Hibernate en les pla�ant dans les fichiers de mapping.
</para>
+
+ <para>
+ Notez aussi que la d�claration d'une requ�te dans un �l�ment <literal><hibernate-mapping></literal>
+ n�cessite un nom globalement unique pour la requ�te, alors que la d�claration d'une requ�te
+ dans une �l�ment <literal><class></literal> est rendue unique de mani�re automatique par
+ la mise en pr�fixe du nom enti�rement de la classe, par exemple
+ <literal>eg.Cat.ByNameAndMaximumWeight</literal>.
+ </para>
+
</sect3>
Modified: branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/transactions.xml
===================================================================
--- branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/transactions.xml 2006-10-02 18:02:18 UTC (rev 10540)
+++ branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/transactions.xml 2006-10-02 18:27:05 UTC (rev 10541)
@@ -482,7 +482,7 @@
</sect2>
- <sect2 id="transactions-demarcation-jta" revision="2">
+ <sect2 id="transactions-demarcation-jta" revision="3">
<title>Utilisation de JTA</title>
<para>Si votre couche de persistance s'ex�cute dans un serveur d'application (par exemple, derri�re un EJB
@@ -514,19 +514,26 @@
sess.close();
}]]></programlisting>
- <para>Ou encore, avec la gestion automatique de contexte:</para>
-
+ <para>
+ Si vous souhaitez utiliser une <literal>Session</literal> coupl�e � la transaction, c'est � dire, utiliser
+ la fonctionnalit� <literal>getCurrentSession()</literal> pour la propagation facile du contexte,
+ vous devrez utiliser l'API JTA <literal>UserTransaction</literal> directement:
+ </para>
<programlisting><![CDATA[// BMT idiom with getCurrentSession()
try {
- factory.getCurrentSession().beginTransaction();
+ UserTransaction tx = (UserTransaction)new InitialContext()
+ .lookup("java:comp/UserTransaction");
- // do some work
- ...
+ tx.begin();
- factory.getCurrentSession().getTransaction().commit();
+ // Do some work on Session bound to transaction
+ factory.getCurrentSession().load(...);
+ factory.getCurrentSession().persist(...);
+
+ tx.commit();
}
catch (RuntimeException e) {
- factory.getCurrentSession().getTransaction().rollback();
+ tx.rollback();
throw e; // or display error message
}]]></programlisting>
Modified: branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/tutorial.xml
===================================================================
--- branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/tutorial.xml 2006-10-02 18:02:18 UTC (rev 10540)
+++ branches/Branch_3_2/Hibernate3/doc/reference/fr/modules/tutorial.xml 2006-10-02 18:27:05 UTC (rev 10541)
@@ -18,7 +18,7 @@
les biblioth�ques tierces que nous nommons sont pour les JDK 1.4 et 5.0. Vous
pourriez avoir besoin d'autres biblioth�ques pour le JDK 1.3.
</para>
-
+
<para>
Le code source de ce tutoriel est inclus dans la distribution dans le r�pertoire
<literal>doc/reference/tutorial/</literal>.
@@ -26,7 +26,7 @@
</sect1>
- <sect1 id="tutorial-firstapp" revision="1">
+ <sect1 id="tutorial-firstapp" revision="2">
<title>Partie 1 - Premi�re application Hibernate</title>
<para>
@@ -339,7 +339,7 @@
</sect2>
- <sect2 id="tutorial-firstapp-configuration" revision="1">
+ <sect2 id="tutorial-firstapp-configuration" revision="2">
<title>Configuration d'Hibernate</title>
<para>
@@ -351,14 +351,14 @@
</para>
<para>
- Cr�ez un r�pertoire appel� <literal>data</literal> � la racine du r�pertoire de d�veloppement -
+ Cr�ez un r�pertoire appel� <literal>data</literal> � la racine du r�pertoire de d�veloppement -
c'est l� que HSQL DB stockera ses fichiers de donn�es. D�marrez maintenant votre base de donn�es
- en ex�cutant <literal>java -classpath lib/hsqldb.jar org.hsqldb.Server</literal> dans votre r�pertoire de travail.
+ en ex�cutant <literal>java -classpath ../lib/hsqldb.jar org.hsqldb.Server</literal> dans votre r�pertoire de donn�es.
Vous observez qu'elle d�marre et ouvre une socket TCP/IP, c'est l� que notre application
se connectera plus tard. Si vous souhaitez d�marrez � partir d'une nouvelle base de donn�es
pour ce tutoriel (faites <literal>CTRL + C</literal> dans la fen�tre the window), effacez
le r�pertoire <literal>data/</literal> et red�marrez HSQL DB � nouveau.
-
+
</para>
<para>
@@ -533,7 +533,7 @@
<para>
Nous cr�erons une classe d'aide <literal>HibernateUtil</literal> qui s'occupe du
- d�marrage et rend la gestion des <literal>Session</literal>s plus facile.
+ d�marrage et rend la gestion des <literal>Session</literal>s plus facile.
Regardons l'impl�mentation :
</para>
@@ -614,7 +614,7 @@
</sect2>
- <sect2 id="tutorial-firstapp-workingpersistence" revision="4">
+ <sect2 id="tutorial-firstapp-workingpersistence" revision="5">
<title>Charger et stocker des objets</title>
<para>
@@ -655,8 +655,10 @@
session.save(theEvent);
session.getTransaction().commit();
- }]]></programlisting>
+ }
+}]]></programlisting>
+
<para>
Nous cr�ons un nouvel objet <literal>Event</literal>, et le remettons � Hibernate.
Hibernate s'occupe maintenant du SQL et ex�cute les <literal>INSERT</literal>s
@@ -675,22 +677,39 @@
<para>
Que fait <literal>sessionFactory.getCurrentSession()</literal> ? Premi�rement, vous pouvez
l'invoquer autant de fois que vous le voulez et n'importe o� du moment que vous avez votre
- <literal>SessionFactory</literal> (facile gr�ce � <literal>HibernateUtil</literal>).
+ <literal>SessionFactory</literal> (facile gr�ce � <literal>HibernateUtil</literal>).
La m�thode <literal>getCurrentSession()</literal> renvoie toujours l'unit� de travail courante.
Souvenez vous que nous avons bascul� notre option de configuration au m�canisme bas� sur le "thread"
- dans <literal>hibernate.cfg.xml</literal>. Par cons�quent, le scope de l'unit� de travail
- courante est le thread java courant d'ex�cution. Ceci n'est pas totalement vrai. Une
- <literal>Session</literal> commence lorsqu'elle est vraiment utilis�e la premi�re fois,
- Lorsque nous appelons pour la premi�re fois <literal>getCurrentSession()</literal>.
- Ensuite, elle est li�e, par Hibernate, au thread courant. Lorsque la transaction s'ach�ve
- (commit ou rollback), Hibernate d�lie la <literal>Session</literal> du thread et la ferme
- pour vous. Si vous invoquez <literal>getCurrentSession()</literal> une autre fois, vous obtenez
+ dans <literal>hibernate.cfg.xml</literal>. Par cons�quent, l'unit� de travail courante est li�e
+ au thread Java courant qui ex�cute notre application. Cependant, ce n'est pas tout, vous devez
+ aussi consid�rer le scope, quand une unit� de travail commence et quand elle finit.
+ </para>
+
+ <para>
+ Une <literal>Session</literal> commence lorsqu'elle est vraiment utilis�e la premi�re fois,
+ lorsque nous appelons <literal>getCurrentSession()</literal> pour la premi�re fois.
+ Ensuite, elle est attach�e par Hibernate au thread courant. Lorsque la transaction s'ach�ve, par
+ commit ou par rollback, Hibernate d�tache automatiquement la <literal>Session</literal> du thread et la ferme
+ pour vous. Si vous invoquez <literal>getCurrentSession()</literal> une nouvelle fois, vous obtenez
une nouvelle <literal>Session</literal> et pouvez entamer une nouvelle unit� de travail.
- Ce mod�le de programmation "<emphasis>thread-bound</emphasis>" est le moyen le plus
- populaire d'utiliser Hibernate.
+ Ce mod�le de programmation "<emphasis>thread-bound</emphasis>" est le moyen le plus
+ populaire d'utiliser Hibernate, puisqu'il permet un d�coupage flexible de votre code (le code d�limitant
+ les transactions peut �tre s�par� du code acc�dant aux donn�es, nous verrons cela plus loin dans ce tutorial).
</para>
-
+
<para>
+ A propos du scope de l'unit� de travail, la <literal>Session</literal> Hibernate devrait-elle
+ �tre utilis�e pour ex�cuter une ou plusieurs op�rations en base de donn�es ? L'exemple ci-dessus
+ utilise une <literal>Session</literal> pour une op�ration. C'est une pure co�ncidence,
+ l'exemple est n'est seulement pas assez complexe pour montrer d'autres approches. Le scope d'une
+ <literal>Session</literal> Hibernate est flexible mais vous ne devriez jamais concevoir
+ votre application de mani�re � utiliser une nouvelle <literal>Session</literal> Hibernate pour
+ <emphasis>chaque</emphasis> op�ration en base de donn�es. Donc m�me si vous le voyez quelques fois
+ dans les exemples (tr�s simplistes) suivants, consid�rez <emphasis>une session par operation</emphasis>
+ comme un anti-pattern. Une v�ritable application (web) est montr�e plus loin dans ce tutorial.
+ </para>
+
+ <para>
Lisez <xref linkend="transactions"/> pour plus d'informations sur la gestion des transactions et leur d�marcations.
Nous n'avons pas g�r� les erreurs et rollback sur l'exemple pr�c�dent.
</para>
@@ -836,7 +855,7 @@
}]]></programlisting>
<para>
- Cr�ez un nouveau fichier de mapping appel� <literal>Person.hbm.xml</literal>
+ Cr�ez un nouveau fichier de mapping appel� <literal>Person.hbm.xml</literal>
(n'oubliez pas la r�f�rence � la DTD)
</para>
@@ -868,7 +887,7 @@
</sect2>
- <sect2 id="tutorial-associations-unidirset" revision="2">
+ <sect2 id="tutorial-associations-unidirset" revision="3">
<title>Une association unidirectionnelle bas�e sur Set</title>
<para>
@@ -906,7 +925,7 @@
Ce n'est pas n�cessaire d'un point de vue fonctionnel. Vous pourrez toujours ex�cuter une requ�te
explicite pour r�cup�rer les participants d'un "event" particulier. Ce choix de conception
vous est laiss�, mais ce qui reste certains est la cardinalit� de l'association: "plusieurs"
- des deux c�t�s, nous appelons cela une association <emphasis>many-to-many</emphasis>.
+ des deux c�t�s, nous appelons cela une association <emphasis>many-to-many</emphasis>.
Par cons�quent nous utilisons un mapping Hibernate many-to-many:
</para>
@@ -920,7 +939,7 @@
<set name="events" table="PERSON_EVENT">
<key column="PERSON_ID"/>
- <many-to-many column="EVENT_ID" class="Event"/>
+ <many-to-many column="EVENT_ID" class="events.Event"/>
</set>
</class>]]></programlisting>
@@ -957,7 +976,7 @@
</sect2>
- <sect2 id="tutorial-associations-working" revision="1">
+ <sect2 id="tutorial-associations-working" revision="2">
<title>Travailler avec l'association</title>
<para>
@@ -991,14 +1010,14 @@
Hibernate surveille les changements et ex�cute le SQL correspondant. Le processus de
synchronisation de l'�tat de la m�moire avec la base de donn�es, g�n�ralement seulement � la fin
d'une unit� de travail, est appel� <emphasis>flushing</emphasis>. Dans notre code, l'unit� de travail
- s'ach�ve par un commit (ou rollback) de la transaction avec la base de donn�es - comme d�fini
+ s'ach�ve par un commit (ou rollback) de la transaction avec la base de donn�es - comme d�fini
par notre option <literal>thread</literal> de configuration pour la classe <literal>CurrentSessionContext</literal>.
</para>
<para>
Vous pourriez bien s�r charger une personne et un �v�nement dans diff�rentes unit�s de travail. Ou
vous modifiez un objet � l'ext�rieur d'une <literal>Session</literal>, s'il n'est pas dans un �tat
- persistant (s'il �tait persistant avant, nous appelons cet �tat <emphasis>d�tach�</emphasis>).
+ persistant (s'il �tait persistant avant, nous appelons cet �tat <emphasis>d�tach�</emphasis>).
Vous pouvez m�me modifier une collection lorsqu'elle est d�tach�e:
</para>
@@ -1038,6 +1057,14 @@
pour retourner cet identifiant).
</para>
+ <para>
+ Cela n'a pas grand int�r�t dans notre situation, mais c'est un concept important qu'il vous faut concevoir
+ dans votre application. Pour le moment, compl�tez cet excercice en ajoutant une nouvelle
+ action � la m�thode principale de l'<literal>EventManager</literal> et invoquez la depuis la ligne de commande.
+ Si vous avez besoin des identifiants d'un client et d'un �v�nement - la m�thode <literal>save()</literal>
+ vous les retourne (vous devrez peut �tre modifier certaines m�thodes pr�c�dentes pour retourner ces identifiants):
+ </para>
+
<programlisting><![CDATA[else if (args[0].equals("addpersontoevent")) {
Long eventId = mgr.createAndStoreEvent("My Event", new Date());
Long personId = mgr.createAndStorePerson("Foo", "Bar");
@@ -1045,15 +1072,6 @@
System.out.println("Added person " + personId + " to event " + eventId);]]></programlisting>
<para>
- Ce n'est pas tr�s utile dans notre situation actuelle, mais c'est un concept important
- que vous pouvez mettre dans votre propre application.
- Pour le moment, compl�tez cet exercice en ajoutant une nouvelle action � la m�thode
- principale des <literal>EventManager</literal>s et appelez la � partir de la ligne de
- commande. Si vous avez besoin des identifiants d'une personne et d'un �v�nement - la
- m�thode <literal>save()</literal> les retourne.
- </para>
-
- <para>
C'�tait un exemple d'une association entre deux classes de m�me importance, deux entit�s.
Comme mentionn� plus t�t, il y a d'autres classes et d'autres types dans un mod�le typique,
g�n�ralement "moins importants". Vous en avez d�j� vu certains, comme un <literal>int</literal>
@@ -1143,7 +1161,7 @@
nous l'avons fait avant en liant des personnes et des �v�nements. C'est le m�me code
en Java.
</para>
-
+
<programlisting><![CDATA[private void addEmailToPerson(Long personId, String emailAddress) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
@@ -1285,7 +1303,7 @@
-->
</sect2>
</sect1>
-
+
<sect1 id="tutorial-webapp">
<title>Part 3 - L'application web EventManager</title>
@@ -1296,11 +1314,11 @@
la base de donn�es, et fournir une formulaire HTML pour saisir d'autres �v�nements.
</para>
- <sect2 id="tutorial-webapp-servlet">
+ <sect2 id="tutorial-webapp-servlet" revision="2">
<title>Ecrire la servlet de base</title>
<para>
- Cr�ons une nouvelle classe dans notre r�pertoire source, dans le package <literal>events</literal>:
+ Cr�ons une nouvelle classe dans notre r�pertoire source, dans le package <literal>events</literal> :
</para>
<programlisting><![CDATA[package events;
@@ -1309,35 +1327,28 @@
public class EventManagerServlet extends HttpServlet {
- private final SimpleDateFormat dateFormatter =
- new SimpleDateFormat("dd.MM.yyyy");
-
// Servlet code
}]]></programlisting>
<para>
- Le <literal>dateFormatter</literal> est un outil que nous utiliserons plus tard pour convertir les objets
- <literal>Date</literal> depuis et vers des chaines de caract�res. Il est propice de n'avoir qu'un
- formatter comme membre de la servlet.
- </para>
-
- <para>
La servlet n'accepte que les requ�tes HTTP <literal>GET</literal>, la m�thode � impl�menter est donc
- <literal>doGet()</literal>:
+ <literal>doGet()</literal> :
</para>
<programlisting><![CDATA[protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
+ SimpleDateFormat dateFormatter = new SimpleDateFormat("dd.MM.yyyy");
+
try {
- // Begin unit of work
+ // D�but de l'unit� de travail
HibernateUtil.getSessionFactory()
.getCurrentSession().beginTransaction();
- // Process request and render page...
+ // Traitement de la requ�te et rendu de la page...
- // End unit of work
+ // Fin de l'unit� de travail
HibernateUtil.getSessionFactory()
.getCurrentSession().getTransaction().commit();
@@ -1350,15 +1361,22 @@
}]]></programlisting>
<para>
- La pattern que nous utilisons ici est appel� <emphasis>session-per-request</emphasis>.
- Lorsqu'une requ�te touche la servlet, une nouvelle <literal>Session</literal> hibernate est
- ouverte � l'invocationde <literal>getCurrentSession()</literal> sur la
- <literal>SessionFactory</literal>. Ensuite, une transaction avec la base de donn�es est d�marr�e—
- tous les acc�s � la base de donn�es interviennent au sein de la transactiton, peu importe que les donn�es
+ Le pattern que nous utilisons ici est appel� <emphasis>session-per-request</emphasis>.
+ Lorsqu'une requ�te appelle la servlet, une nouvelle <literal>Session</literal> Hibernate est
+ ouverte � l'invocation de <literal>getCurrentSession()</literal> sur la
+ <literal>SessionFactory</literal>. Ensuite, une transaction avec la base de donn�es est d�marr�e —
+ tous les acc�s � la base de donn�es interviennent au sein de la transaction, peu importe que les donn�es
soient lues ou �crites (nous n'utilisons pas le mode auto-commit dans les applications).
</para>
<para>
+ <emphasis>N'utilisez pas</emphasis> une nouvelle <literal>Session</literal> Hibernate pour
+ chaque op�ration en base de donn�es. Utilisez une <literal>Session</literal> Hibernate qui
+ porte sur l'ensemble de la requ�te. Utlisez <literal>getCurrentSession()</literal>,
+ ainsi elle est automatiquement attach�e au thread Java courant.
+ </para>
+
+ <para>
Ensuite, les actions possibles de la requ�tes sont ex�cut�es et la r�ponse HTML
est rendue. Nous en parlerons plus tard.
</para>
@@ -1367,20 +1385,20 @@
Enfin, l'unit� de travail s'ach�ve lorsque l'ex�cution et le rendu sont achev�s.
Si un probl�me survient lors de ces deux phases, une exception est soulev�e et la
transaction avec la base de donn�es subit un rollback. Voila pour le pattern
- <literal>session-per-request</literal>. Au lieu d'un code de d�marcation de transaction
+ <literal>session-per-request</literal>. Au lieu d'avoir un code de d�limitant les transactions
au sein de chaque servlet, vous pouvez �crire un filtre de servlet.
Voir le site Hibernate et le Wiki pour plus d'information sur ce pattern, appel�
- <emphasis>Open Session in View</emphasis>— vous en aurez besoin d�s que vous
- utiliserez des JSPs et non plus des servlets pour le rendu de vos vues.
+ <emphasis>Open Session in View</emphasis> — vous en aurez besoin d�s que vous
+ utiliserez des JSPs et non plus des servlets pour le rendu de vos vues.
</para>
</sect2>
- <sect2 id="tutorial-webapp-processing">
+ <sect2 id="tutorial-webapp-processing" revision="1">
<title>Proc�der et rendre</title>
<para>
- Impl�mentons l'ex�cution de la requ�te et le rendu de la page.
+ Impl�mentons l'ex�cution de la requ�te et le rendu de la page.
</para>
<programlisting><![CDATA[// Write HTML header
@@ -1411,7 +1429,7 @@
out.close();]]></programlisting>
<para>
- Ce style de code avec un mix de Java et d'HTML ne serait pas scalable
+ Ce style de code avec un mix de Java et d'HTML ne serait pas scalable
dans une application plus complexe—gardez � l'esprit que nous ne faisons qu'illustrer
les concepts basiques d'Hibernate dans ce tutoriel. Ce code affiche une en t�te et un pied de page
HTML. Dans cette page, sont affich�s un formulaire pour la saisie d'�v�nements ainsi
@@ -1434,7 +1452,8 @@
requ�te:
</para>
- <programlisting><![CDATA[private void listEvents(PrintWriter out) {
+ <programlisting><![CDATA[private void listEvents(PrintWriter out, SimpleDateFormat dateFormatter) {
+
List result = HibernateUtil.getSessionFactory()
.getCurrentSession().createCriteria(Event.class).list();
if (result.size() > 0) {
@@ -1535,13 +1554,13 @@
<para>
Pour construire et d�ployer, appelez <literal>ant war</literal> dans votre projet et
copier le fichier <literal>hibernate-tutorial.war</literal> dans le r�pertoire <literal>webapp</literal> de tomcat
- Si vous n'avez pas install� Tomcat, t�l�chargez le et suivez la notice d'installation.
+ Si vous n'avez pas install� Tomcat, t�l�chargez le et suivez la notice d'installation.
Vous n'avez pas � modifier la configuration Tomcat pour d�ployer cette application.
</para>
<para>
Une fois l'application d�ploy�e et Tomcat lanc�, acc�dez � l'application via
- <literal>http://localhost:8080/hibernate-tutorial/eventmanager</literal>.
+ <literal>http://localhost:8080/hibernate-tutorial/eventmanager</literal>.
Assurez vous de consulter les traces tomcat pour observer l'initialisation
d'Hibernate � la premi�re requ�te touchant votre servlet (l'initialisation statique dans <literal>HibernateUtil</literal>
est invoqu�e) et pour v�rifier qu'aucune exception ne survienne.
17 years, 6 months