|
From: <one...@us...> - 2003-01-25 01:26:11
|
Update of /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/persister
In directory sc8-pr-cvs1:/tmp/cvs-serv30516/sf/hibernate/persister
Modified Files:
EntityPersister.java NormalizedEntityPersister.java
Log Message:
support for immutable properties and dynamic-update for <joined-subclass> mappings
Index: EntityPersister.java
===================================================================
RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/persister/EntityPersister.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -C2 -d -r1.11 -r1.12
*** EntityPersister.java 25 Jan 2003 00:13:55 -0000 1.11
--- EntityPersister.java 25 Jan 2003 01:26:07 -0000 1.12
***************
*** 412,415 ****
--- 412,416 ----
}
+ //TODO: precalculate this
private boolean[] allProperties() {
boolean[] result = new boolean[hydrateSpan];
***************
*** 560,564 ****
if ( dirtyFields[j]==i ) dirty=true;
}
! propsToUpdate[i] = ( dirty && getPropertyMutability()[i] ) || getVersionProperty()==i;
}
update(id, fields, propsToUpdate, oldVersion, object, generateUpdateString(propsToUpdate), session);
--- 561,566 ----
if ( dirtyFields[j]==i ) dirty=true;
}
! propsToUpdate[i] = dirty || getVersionProperty()==i;
! //don't need to check property mutability (dirty checking algorithm handles that)
}
update(id, fields, propsToUpdate, oldVersion, object, generateUpdateString(propsToUpdate), session);
Index: NormalizedEntityPersister.java
===================================================================
RCS file: /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/persister/NormalizedEntityPersister.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** NormalizedEntityPersister.java 24 Jan 2003 13:07:17 -0000 1.3
--- NormalizedEntityPersister.java 25 Jan 2003 01:26:07 -0000 1.4
***************
*** 21,24 ****
--- 21,25 ----
import java.sql.SQLException;
import java.util.ArrayList;
+ import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
***************
*** 293,297 ****
* Generate the SQL that updates a row by id (and version)
*/
! protected String[] generateUpdateStrings() {
String[] result = new String[ tableNames.length ];
for ( int j=0; j<tableNames.length; j++ ) {
--- 294,298 ----
* Generate the SQL that updates a row by id (and version)
*/
! protected String[] generateUpdateStrings(boolean[] includeProperty) {
String[] result = new String[ tableNames.length ];
for ( int j=0; j<tableNames.length; j++ ) {
***************
*** 302,306 ****
boolean hasColumns = false;
for (int i=0; i<propertyColumnNames.length; i++) {
! if ( propertyTables[i]==j ) {
update.addColumns( propertyColumnNames[i] );
hasColumns = hasColumns || propertyColumnNames[i].length > 0;
--- 303,307 ----
boolean hasColumns = false;
for (int i=0; i<propertyColumnNames.length; i++) {
! if ( includeProperty[i] && propertyTables[i]==j ) {
update.addColumns( propertyColumnNames[i] );
hasColumns = hasColumns || propertyColumnNames[i].length > 0;
***************
*** 330,334 ****
* Marshall the fields of a persistent instance to a prepared statement
*/
! protected int dehydrate(Serializable id, Object[] fields, PreparedStatement[] statements, SessionImplementor session) throws SQLException, HibernateException {
if ( log.isTraceEnabled() ) log.trace("Dehydrating entity: " + getClassName() + '#' + id);
--- 331,335 ----
* Marshall the fields of a persistent instance to a prepared statement
*/
! protected int dehydrate(Serializable id, Object[] fields, boolean[] includeProperty, PreparedStatement[] statements, SessionImplementor session) throws SQLException, HibernateException {
if ( log.isTraceEnabled() ) log.trace("Dehydrating entity: " + getClassName() + '#' + id);
***************
*** 337,341 ****
for ( int i=0; i<tableNames.length; i++ ) {
! int index = dehydrate(id, fields, i, statements[i], session);
if (i==0) versionParam = index;
}
--- 338,342 ----
for ( int i=0; i<tableNames.length; i++ ) {
! int index = dehydrate(id, fields, includeProperty, i, statements[i], session);
if (i==0) versionParam = index;
}
***************
*** 345,349 ****
}
! private int dehydrate(Serializable id, Object[] fields, int table, PreparedStatement statement, SessionImplementor session) throws SQLException, HibernateException {
if (statement==null) return -1;
--- 346,350 ----
}
! private int dehydrate(Serializable id, Object[] fields, boolean[] includeProperty, int table, PreparedStatement statement, SessionImplementor session) throws SQLException, HibernateException {
if (statement==null) return -1;
***************
*** 353,357 ****
for (int j=0; j<hydrateSpan; j++) {
! if ( propertyTables[j]==table ) {
getPropertyTypes()[j].nullSafeSet( statement, fields[j], index, session );
index += propertyColumnSpans[j];
--- 354,358 ----
for (int j=0; j<hydrateSpan; j++) {
! if ( includeProperty[j] && propertyTables[j]==table ) {
getPropertyTypes()[j].nullSafeSet( statement, fields[j], index, session );
index += propertyColumnSpans[j];
***************
*** 424,427 ****
--- 425,435 ----
}
+ //TODO: precalculate this
+ private boolean[] allProperties() {
+ boolean[] result = new boolean[hydrateSpan];
+ Arrays.fill(result, true);
+ return result;
+ }
+
/**
* Persist an object
***************
*** 445,449 ****
// insert was issued (cos of foreign key constraints). Not necessarily the object's current state
! dehydrate(id, fields, statements, session);
for ( int i=0; i<tableNames.length; i++ ) statements[i].executeUpdate();
--- 453,457 ----
// insert was issued (cos of foreign key constraints). Not necessarily the object's current state
! dehydrate(id, fields, allProperties(), statements, session);
for ( int i=0; i<tableNames.length; i++ ) statements[i].executeUpdate();
***************
*** 476,480 ****
PreparedStatement statement = session.getBatcher().prepareStatement( sql[0] );
try {
! dehydrate(null, fields, 0, statement, session);
statement.executeUpdate();
}
--- 484,488 ----
PreparedStatement statement = session.getBatcher().prepareStatement( sql[0] );
try {
! dehydrate(null, fields, allProperties(), 0, statement, session);
statement.executeUpdate();
}
***************
*** 516,520 ****
try {
! dehydrate(id, fields, i, statement, session);
statement.executeUpdate();
}
--- 524,528 ----
try {
! dehydrate(id, fields, allProperties(), i, statement, session);
statement.executeUpdate();
}
***************
*** 579,585 ****
*/
public void update(Serializable id, Object[] fields, int[] dirtyFields, Object oldVersion, Object object, SessionImplementor session) throws SQLException, HibernateException {
!
! int tables = tableNames.length;
!
boolean[] tableUpdateNeeded;
if (dirtyFields==null) {
--- 587,591 ----
*/
public void update(Serializable id, Object[] fields, int[] dirtyFields, Object oldVersion, Object object, SessionImplementor session) throws SQLException, HibernateException {
!
boolean[] tableUpdateNeeded;
if (dirtyFields==null) {
***************
*** 587,591 ****
}
else {
! tableUpdateNeeded = new boolean[tables];
for ( int i=0; i<dirtyFields.length; i++ ) {
tableUpdateNeeded[ propertyTables[ dirtyFields[i] ] ] = true;
--- 593,597 ----
}
else {
! tableUpdateNeeded = new boolean[tableNames.length];
for ( int i=0; i<dirtyFields.length; i++ ) {
tableUpdateNeeded[ propertyTables[ dirtyFields[i] ] ] = true;
***************
*** 593,596 ****
--- 599,620 ----
if ( isVersioned() ) tableUpdateNeeded[0] = true;
}
+
+ if ( useDynamicUpdate() && dirtyFields!=null ) {
+ boolean[] propsToUpdate = new boolean[hydrateSpan];
+ for ( int i=0; i<hydrateSpan; i++ ) {
+ boolean dirty=false;
+ for (int j=0; j<dirtyFields.length; j++) {
+ if ( dirtyFields[j]==i ) dirty=true;
+ }
+ propsToUpdate[i] = dirty || getVersionProperty()==i;
+ }
+ update(id, fields, propsToUpdate, tableUpdateNeeded, oldVersion, object, generateUpdateStrings(propsToUpdate), session);
+ }
+ else {
+ update(id, fields, getPropertyMutability(), tableUpdateNeeded, oldVersion, object, sqlUpdate(), session);
+ }
+ }
+
+ protected void update(Serializable id, Object[] fields, boolean[] includeProperty, boolean[] includeTable, Object oldVersion, Object object, String[] sql, SessionImplementor session) throws SQLException, HibernateException {
if ( log.isTraceEnabled() ) {
***************
*** 599,615 ****
}
final PreparedStatement[] statements = new PreparedStatement[tables];
try {
! for ( int i=0; i<tableNames.length; i++ ) {
! if ( tableUpdateNeeded[i] ) statements[i] = session.getBatcher().prepareStatement( sqlUpdate()[i] );
}
! int versionParam = dehydrate(id, fields, statements, session);
if ( isVersioned() ) getVersionType().nullSafeSet( statements[0], oldVersion, versionParam, session );
for ( int i=0; i<tables; i++ ) {
! if ( tableUpdateNeeded[i] ) check( statements[i].executeUpdate(), id );
}
--- 623,641 ----
}
+ int tables = tableNames.length;
+
final PreparedStatement[] statements = new PreparedStatement[tables];
try {
! for ( int i=0; i<tables; i++ ) {
! if ( includeTable[i] ) statements[i] = session.getBatcher().prepareStatement( sql[i] );
}
! int versionParam = dehydrate(id, fields, includeProperty, statements, session);
if ( isVersioned() ) getVersionType().nullSafeSet( statements[0], oldVersion, versionParam, session );
for ( int i=0; i<tables; i++ ) {
! if ( includeTable[i] ) check( statements[i].executeUpdate(), id );
}
***************
*** 620,624 ****
}
finally {
! for ( int i=0; i<tableNames.length; i++ ) {
if ( statements[i]!=null ) session.getBatcher().closeStatement( statements[i] );
}
--- 646,650 ----
}
finally {
! for ( int i=0; i<tables; i++ ) {
if ( statements[i]!=null ) session.getBatcher().closeStatement( statements[i] );
}
***************
*** 804,808 ****
insertStrings = generateInsertStrings(false);
identityInsertStrings = isIdentifierAssignedByInsert() ? generateInsertStrings(true) : null;
! updateStrings = generateUpdateStrings();
String lockString = generateLockString();
--- 830,834 ----
insertStrings = generateInsertStrings(false);
identityInsertStrings = isIdentifierAssignedByInsert() ? generateInsertStrings(true) : null;
! updateStrings = generateUpdateStrings( getPropertyMutability() );
String lockString = generateLockString();
|