@ -28,11 +28,11 @@ import org.springframework.core.convert.support.GenericConversionService;
import org.springframework.dao.InvalidDataAccessApiUsageException ;
import org.springframework.dao.InvalidDataAccessApiUsageException ;
import org.springframework.dao.NonTransientDataAccessException ;
import org.springframework.dao.NonTransientDataAccessException ;
import org.springframework.data.convert.Jsr310Converters ;
import org.springframework.data.convert.Jsr310Converters ;
import org.springframework.data.jdbc.core.conversion.Db Change ;
import org.springframework.data.jdbc.core.conversion.Aggregate Change ;
import org.springframework.data.jdbc.core.conversion.Db Change.Kind ;
import org.springframework.data.jdbc.core.conversion.Aggregate Change.Kind ;
import org.springframework.data.jdbc.core.conversion.Interpreter ;
import org.springframework.data.jdbc.core.conversion.Interpreter ;
import org.springframework.data.jdbc.core.conversion.JdbcEntityWriter ;
import org.springframework.data.jdbc.core.conversion.JdbcEntityDeleteWriter ;
import org.springframework.data.jdbc.core.conversion.JdbcEntityDeleteWriter ;
import org.springframework.data.jdbc.core.conversion.JdbcEntityWriter ;
import org.springframework.data.jdbc.mapping.event.AfterDelete ;
import org.springframework.data.jdbc.mapping.event.AfterDelete ;
import org.springframework.data.jdbc.mapping.event.AfterInsert ;
import org.springframework.data.jdbc.mapping.event.AfterInsert ;
import org.springframework.data.jdbc.mapping.event.AfterUpdate ;
import org.springframework.data.jdbc.mapping.event.AfterUpdate ;
@ -63,7 +63,7 @@ import org.springframework.util.Assert;
public class JdbcEntityTemplate implements JdbcEntityOperations {
public class JdbcEntityTemplate implements JdbcEntityOperations {
private static final String ENTITY_NEW_AFTER_INSERT = "Entity [%s] still 'new' after insert. Please set either"
private static final String ENTITY_NEW_AFTER_INSERT = "Entity [%s] still 'new' after insert. Please set either"
+ " the id property in a before i nsert event handler, or ensure the database creates a value and your "
+ " the id property in a BeforeI nsert event handler, or ensure the database creates a value and your "
+ "JDBC driver returns it." ;
+ "JDBC driver returns it." ;
private final ApplicationEventPublisher publisher ;
private final ApplicationEventPublisher publisher ;
@ -73,8 +73,8 @@ public class JdbcEntityTemplate implements JdbcEntityOperations {
private final Interpreter interpreter ;
private final Interpreter interpreter ;
private final SqlGeneratorSource sqlGeneratorSource ;
private final SqlGeneratorSource sqlGeneratorSource ;
private final JdbcEntityWriter jdbcConver ter ;
private final JdbcEntityWriter jdbcEntityWri ter ;
private final JdbcEntityDeleteWriter jdbcEntityDeleteConver ter ;
private final JdbcEntityDeleteWriter jdbcEntityDeleteWri ter ;
public JdbcEntityTemplate ( ApplicationEventPublisher publisher , NamedParameterJdbcOperations operations ,
public JdbcEntityTemplate ( ApplicationEventPublisher publisher , NamedParameterJdbcOperations operations ,
JdbcMappingContext context ) {
JdbcMappingContext context ) {
@ -83,10 +83,10 @@ public class JdbcEntityTemplate implements JdbcEntityOperations {
this . operations = operations ;
this . operations = operations ;
this . context = context ;
this . context = context ;
jdbcConver ter = new JdbcEntityWriter ( this . context ) ;
this . jdbcEntityWri ter = new JdbcEntityWriter ( this . context ) ;
jdbcEntityDeleteConver ter = new JdbcEntityDeleteWriter ( this . context ) ;
this . jdbcEntityDeleteWri ter = new JdbcEntityDeleteWriter ( this . context ) ;
sqlGeneratorSource = new SqlGeneratorSource ( this . context ) ;
this . sqlGeneratorSource = new SqlGeneratorSource ( this . context ) ;
interpreter = new JdbcInterpreter ( this . context , this ) ;
this . interpreter = new Default JdbcInterpreter( this . context , this ) ;
}
}
private static GenericConversionService getDefaultConversionService ( ) {
private static GenericConversionService getDefaultConversionService ( ) {
@ -99,11 +99,11 @@ public class JdbcEntityTemplate implements JdbcEntityOperations {
@Override
@Override
public < T > void save ( T instance , Class < T > domainType ) {
public < T > void save ( T instance , Class < T > domainType ) {
createDb Change ( instance ) . executeWith ( interpreter ) ;
createChange ( instance ) . executeWith ( interpreter ) ;
}
}
@Override
@Override
public < T > void insert ( T instance , Class < T > domainType , Map < String , Object > additionalParameter ) {
public < T > void insert ( T instance , Class < T > domainType , Map < String , Object > additionalParameters ) {
publisher . publishEvent ( new BeforeInsert ( instance ) ) ;
publisher . publishEvent ( new BeforeInsert ( instance ) ) ;
@ -118,9 +118,9 @@ public class JdbcEntityTemplate implements JdbcEntityOperations {
JdbcPersistentProperty idProperty = persistentEntity . getRequiredIdProperty ( ) ;
JdbcPersistentProperty idProperty = persistentEntity . getRequiredIdProperty ( ) ;
propertyMap . put ( idProperty . getColumnName ( ) , convert ( idValue , idProperty . getColumnType ( ) ) ) ;
propertyMap . put ( idProperty . getColumnName ( ) , convert ( idValue , idProperty . getColumnType ( ) ) ) ;
propertyMap . putAll ( additionalParameter ) ;
propertyMap . putAll ( additionalParameters ) ;
operations . update ( sql ( domainType ) . getInsert ( idValue = = null , additionalParameter . keySet ( ) ) ,
operations . update ( sql ( domainType ) . getInsert ( idValue = = null , additionalParameters . keySet ( ) ) ,
new MapSqlParameterSource ( propertyMap ) , holder ) ;
new MapSqlParameterSource ( propertyMap ) , holder ) ;
setIdFromJdbc ( instance , holder , persistentEntity ) ;
setIdFromJdbc ( instance , holder , persistentEntity ) ;
@ -177,8 +177,13 @@ public class JdbcEntityTemplate implements JdbcEntityOperations {
String findAllInListSql = sql ( domainType ) . getFindAllInList ( ) ;
String findAllInListSql = sql ( domainType ) . getFindAllInList ( ) ;
Class < ? > targetType = getRequiredPersistentEntity ( domainType ) . getRequiredIdProperty ( ) . getColumnType ( ) ;
Class < ? > targetType = getRequiredPersistentEntity ( domainType ) . getRequiredIdProperty ( ) . getColumnType ( ) ;
MapSqlParameterSource parameter = new MapSqlParameterSource ( "ids" ,
StreamSupport . stream ( ids . spliterator ( ) , false ) . map ( id - > convert ( id , targetType ) ) . collect ( Collectors . toList ( ) ) ) ;
MapSqlParameterSource parameter = new MapSqlParameterSource ( //
"ids" , //
StreamSupport . stream ( ids . spliterator ( ) , false ) //
. map ( id - > convert ( id , targetType ) ) //
. collect ( Collectors . toList ( ) ) //
) ;
return operations . query ( findAllInListSql , parameter , getEntityRowMapper ( domainType ) ) ;
return operations . query ( findAllInListSql , parameter , getEntityRowMapper ( domainType ) ) ;
}
}
@ -199,7 +204,7 @@ public class JdbcEntityTemplate implements JdbcEntityOperations {
@Override
@Override
public void deleteAll ( Class < ? > domainType ) {
public void deleteAll ( Class < ? > domainType ) {
Db Change change = createDeletingDb Change ( domainType ) ;
Aggregate Change change = createDeletingChange ( domainType ) ;
change . executeWith ( interpreter ) ;
change . executeWith ( interpreter ) ;
}
}
@ -225,7 +230,6 @@ public class JdbcEntityTemplate implements JdbcEntityOperations {
publisher . publishEvent ( new BeforeDelete ( specifiedId , optionalEntity ) ) ;
publisher . publishEvent ( new BeforeDelete ( specifiedId , optionalEntity ) ) ;
String deleteByIdSql = sql ( domainType ) . getDeleteById ( ) ;
String deleteByIdSql = sql ( domainType ) . getDeleteById ( ) ;
MapSqlParameterSource parameter = createIdParameterSource ( specifiedId . getValue ( ) , domainType ) ;
MapSqlParameterSource parameter = createIdParameterSource ( specifiedId . getValue ( ) , domainType ) ;
operations . update ( deleteByIdSql , parameter ) ;
operations . update ( deleteByIdSql , parameter ) ;
@ -235,30 +239,30 @@ public class JdbcEntityTemplate implements JdbcEntityOperations {
private void deleteTree ( Object id , Object entity , Class < ? > domainType ) {
private void deleteTree ( Object id , Object entity , Class < ? > domainType ) {
Db Change change = createDeletingDb Change ( id , entity , domainType ) ;
Aggregate Change change = createDeletingChange ( id , entity , domainType ) ;
change . executeWith ( interpreter ) ;
change . executeWith ( interpreter ) ;
}
}
private < T > DbChange createDb Change( T instance ) {
private < T > AggregateChange create Change( T instance ) {
DbChange dbChange = new Db Change( Kind . SAVE , instance . getClass ( ) , instance ) ;
AggregateChange aggregateChange = new Aggregate Change( Kind . SAVE , instance . getClass ( ) , instance ) ;
jdbcConver ter . write ( instance , db Change) ;
jdbcEntityWri ter . write ( instance , aggregate Change) ;
return db Change;
return aggregate Change;
}
}
private DbChange createDeletingDb Change( Object id , Object entity , Class < ? > domainType ) {
private AggregateChange createDeleting Change( Object id , Object entity , Class < ? > domainType ) {
DbChange dbChange = new Db Change( Kind . DELETE , domainType , entity ) ;
AggregateChange aggregateChange = new Aggregate Change( Kind . DELETE , domainType , entity ) ;
jdbcEntityDeleteConver ter . write ( id , db Change) ;
jdbcEntityDeleteWri ter . write ( id , aggregate Change) ;
return db Change;
return aggregate Change;
}
}
private DbChange createDeletingDb Change( Class < ? > domainType ) {
private AggregateChange createDeleting Change( Class < ? > domainType ) {
DbChange dbChange = new Db Change( Kind . DELETE , domainType , null ) ;
AggregateChange aggregateChange = new Aggregate Change( Kind . DELETE , domainType , null ) ;
jdbcEntityDeleteConver ter . write ( null , db Change) ;
jdbcEntityDeleteWri ter . write ( null , aggregate Change) ;
return db Change;
return aggregate Change;
}
}
private < T > MapSqlParameterSource createIdParameterSource ( Object id , Class < T > domainType ) {
private < T > MapSqlParameterSource createIdParameterSource ( Object id , Class < T > domainType ) {