christophstrobl on 3.4.x
Prepare issue branch. Remove assertions on hot code p… (compare)
schauder on main
Improve robustness of Hibernate… Polishing. Added author tag, J… (compare)
schauder on 2.7.x
Improve robustness of Hibernate… Polishing. Added author tag, J… (compare)
meistermeier on gh-2521
meistermeier on main
GH-2543 - Fix Neo4j 5.0 Cypher … (compare)
mp911de on main
Include links to release notes … (compare)
mikereiche on datacouch_1145_transaction_support
Get scope and collection from p… (compare)
mp911de on main
Update readme after changelog r… (compare)
mp911de on 2.6.x
Fix resource disposal ordering … (compare)
mp911de on 2.7.x
Fix resource disposal ordering … (compare)
mp911de on main
Fix resource disposal ordering … (compare)
Hello, running into an issue when a bean is created for a JDBC repository.
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'withdrawalDao' defined in com.sugal.gateway.dao.WithdrawalDao defined in @EnableJdbcRepositories declared on JdbcConfiguration: Invocation of init method failed; nested exception is java.lang.reflect.InaccessibleObjectException:
WithdrawalDao
@Repository public interface WithdrawalDao extends CrudRepository<Withdrawal, BigInteger> { }
Java SDK 17, Spring Boot 2.6.3
I am using mySql. I added a converter, but it seems that it is not used. When debugging, I saw it is looking for a converter in GenericConversionService, and my converter is not GenericConverter. Is it the only way to convert?
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;
@Component
public class IntegerToBooleanConverter implements Converter<Integer, Boolean> {
@Override
public Boolean convert(Integer source) {
return source != null && source > 0;
}
}
Caused by: org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [java.lang.Integer] to type [java.lang.Boolean]
at org.springframework.core.convert.support.GenericConversionService.handleConverterNotFound(GenericConversionService.java:322) ~[spring-core-5.3.14.jar:5.3.14]
at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:195) ~[spring-core-5.3.14.jar:5.3.14]
at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:175) ~[spring-core-5.3.14.jar:5.3.14]
at org.springframework.data.r2dbc.convert.MappingR2dbcConverter.getPotentiallyConvertedSimpleRead(MappingR2dbcConverter.java:280) ~[spring-data-r2dbc-1.4.0.jar:1.4.0]
at org.springframework.data.r2dbc.convert.MappingR2dbcConverter.readValue(MappingR2dbcConverter.java:204) ~[spring-data-r2dbc-1.4.0.jar:1.4.0]
at org.springframework.data.r2dbc.convert.MappingR2dbcConverter.readFrom(MappingR2dbcConverter.java:184) ~[spring-data-r2dbc-1.4.0.jar:1.4.0]
at org.springframework.data.r2dbc.convert.MappingR2dbcConverter.read(MappingR2dbcConverter.java:138) ~[spring-data-r2dbc-1.4.0.jar:1.4.0]
at org.springframework.data.r2dbc.convert.MappingR2dbcConverter.read(MappingR2dbcConverter.java:121) ~[spring-data-r2dbc-1.4.0.jar:1.4.0]
at org.springframework.data.r2dbc.convert.EntityRowMapper.apply(EntityRowMapper.java:46) ~[spring-data-r2dbc-1.4.0.jar:1.4.0]
at org.springframework.data.r2dbc.convert.EntityRowMapper.apply(EntityRowMapper.java:29) ~[spring-data-r2dbc-1.4.0.jar:1.4.0]
at dev.miku.r2dbc.mysql.MySqlResult.processRow(MySqlResult.java:176) ~[r2dbc-mysql-0.8.2.RELEASE.jar:0.8.2.RELEASE]
at dev.miku.r2dbc.mysql.MySqlResult.handleResult(MySqlResult.java:149) ~[r2dbc-mysql-0.8.2.RELEASE.jar:0.8.2.RELEASE]
at dev.miku.r2dbc.mysql.MySqlResult.lambda$map$1(MySqlResult.java:93) ~[r2dbc-mysql-0.8.2.RELEASE.jar:0.8.2.RELEASE]
at reactor.core.publisher.FluxHandle$HandleSubscriber.onNext(FluxHandle.java:103) ~[reactor-core-3.4.13.jar:3.4.13]
at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onNext(FluxContextWrite.java:107) ~[reactor-core-3.4.13.jar:3.4.13]
at dev.miku.r2dbc.mysql.util.DiscardOnCancelSubscriber.onNext(DiscardOnCancelSubscriber.java:70) ~[r2dbc-mysql-0.8.2.RELEASE.jar:0.8.2.RELEASE]
at reactor.core.publisher.FluxWindowPredicate$WindowFlux.drainRegular(FluxWindowPredicate.java:668) ~[reactor-core-3.4.13.jar:3.4.13]
at reactor.core.publisher.FluxWindowPredicate$WindowFlux.drain(FluxWindowPredicate.java:746) ~[reactor-core-3.4.13.jar:3.4.13]
at reactor.core.publisher.FluxWindowPredicate$WindowFlux.onNext(FluxWindowPredicate.java:788) ~[reactor-core-3.4.13.jar:3.4.13]
at reactor.core.publisher.FluxWindowPredicate$WindowPredicateMain.onNext(FluxWindowPredicate.java:266) ~[reactor-core-3.4.13.jar:3.4.13]
at reactor.core.publisher.FluxHandleFuseable$HandleFuseableSubscriber.onNext(FluxHandleFuseable.java:184) ~[reactor-core-3.4.13.jar:3.4.13]
at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onNext(FluxContextWrite.java:107) ~[reactor-core-3.4.13.jar:3.4.13]
at dev.miku.r2dbc.mysql.util.DiscardOnCancelSubscriber.onNext(DiscardOnCancelSubscriber.java:70) ~[r2dbc-mysql-0.8.2.RELEASE.jar:0.8.2.RELEASE]
at reactor.core.publisher.FluxPeekFuseable$PeekConditionalSubscriber.onNext(FluxPeekFuseable.java:854) ~[reactor-core-3.4.13.jar:3.4.13]
@Configuration
class R2dbcConfiguration {
@Bean
public R2dbcCustomConversions r2dbcCustomConversions(Set<Converter> customConverters, ConnectionFactory connectionFactory) {
val dialect = DialectResolver.getDialect(connectionFactory);
val converters = new ArrayList<>();
converters.addAll(customConverters);
converters.addAll(dialect.getConverters());
return new R2dbcCustomConversions(R2dbcCustomConversions.STORE_CONVERSIONS ,converters);
}
}
class StringToContractTypeConverter : Converter<String, ContractType>, ConditionalConverter {
override fun convert(source: String): ContractType {
return ContractType.read(source)
}
override fun matches(sourceType: TypeDescriptor, targetType: TypeDescriptor): Boolean {
return sourceType.type == String::class.java && targetType.type == ContractType::class.java
}
}
fun ConnectionFactory.createEntityTemplate(converters: List<Any> = emptyList()): R2dbcEntityTemplate {
val dialect = DialectResolver.getDialect(this)
val client = DatabaseClient.builder().connectionFactory(this)
.bindMarkers(dialect.bindMarkersFactory).build()
val strategy = DefaultReactiveDataAccessStrategy(dialect, converters)
return R2dbcEntityTemplate(client, strategy)
}
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable( name = "user_roles",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<Role> roles = new HashSet<>();
user_role is not mapped [SELECT u.id,u.username,u.email FROM com.Application.models.User u,com.Application.models.Role r, user_role ur WHERE u.id=ur.id AND r.id=ur.id AND r.name<>'ADMIN'].
My Role entity is used to map the role ID and the role name whereas my user_role table contains a column of the user ID and the role ID in one table for mapping the user id to a role id. That is where my last error is. Thank you all once again for any help.
Hi everyone!
I'm using Spring Data JBDC along with Spring Boot. I have an aggregate that contains a set of entities that has a set of entities inside as well. During the update or save or the aggregate Spring JDBC always (even if related entities already persisted in DB and ids are specified it will delete it first) inserts records into DB one by one and for fetch, they do one by one select, which makes a performance issue for me. I tried to search for some ways how to improve performance in both cases, but I didn't find something suitable for me. Let me briefly go through every option that I checked.
For fetch, right now I'm using Slices to get data by parts, and here are alternatives:
For save or update, right now I just using the save method of the repo, and here are the alternatives:
So my main question is: Are there some alternatives that I missed for saving and fetching aggregates in JDBC that will reduce performance issues and will keep me safe from implementing a whole bunch of logic on top?
Hi Everyone,
I am using spring-data-mongodb 3.3.4 and spring-core 5.3.19. I was able to persist data in mongoDB bun when I read the document from MongoDB I am getting following error. is there anyway to solve this?
java.lang.IllegalArgumentException: Unsupported Collection interface: java.util.Deque
at org.springframework.core.CollectionFactory.createCollection(CollectionFactory.java:195)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.readCollectionOrArray(MappingMongoConverter.java:1267)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter$ConversionContext.convert(MappingMongoConverter.java:2049)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter$MongoDbPropertyValueProvider.getPropertyValue(MappingMongoConverter.java:1779)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.readProperties(MappingMongoConverter.java:512)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.populateProperties(MappingMongoConverter.java:425)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:394)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.readDocument(MappingMongoConverter.java:356)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:292)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:288)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:107)
at org.springframework.data.mongodb.core.MongoTemplate$ReadDocumentCallback.doWith(MongoTemplate.java:3207)
at org.springframework.data.mongodb.core.MongoTemplate.executeFindOneInternal(MongoTemplate.java:2822)
at org.springframework.data.mongodb.core.MongoTemplate.doFindOne(MongoTemplate.java:2529)
at org.springframework.data.mongodb.core.MongoTemplate.findOne(MongoTemplate.java:811)
at org.springframework.data.mongodb.core.MongoTemplate.findOne(MongoTemplate.java:798)
@Transactional
annotation. Does the transaction extend to the anonymous class' method in this case? @Transactional
private void someTransaction(Aggregate aggregate) {
User user = selectUserForUpdate();
aggregate.getEventsInRange(new EventHandler() {
@Override
public void onX(int x) {
user.setX(x);
user.save();
}
});
}