In relation to this post we've also tried this version with the same issue.
package com.caraer.Caraer.config;
import com.caraer.Caraer.model.User;
import jakarta.annotation.PostConstruct;
import org.neo4j.ogm.config.Configuration;
import org.neo4j.ogm.config.DatabaseSelection;
import org.neo4j.ogm.config.DatabaseSelectionProvider;
import org.neo4j.ogm.session.Session;
import org.neo4j.ogm.session.SessionFactory;
import org.springframework.security.core.context.SecurityContextHolder;
public class Neo4jService {
private Session mainDatabaseSession;
private Session userDatabaseSession;
private SessionFactory mainFactory;
private SessionFactory userFactory;
private GenerateUuid generateUuid;
// Private constructor to prevent instantiation
private Neo4jService() {
// Avoid initialization here
}
@PostConstruct
private void init() {
generateUuid = new GenerateUuid();
Configuration mainConfiguration = new Configuration.Builder()
.uri("bolt://localhost:7687")
.connectionLivenessCheckTimeout(10)
.connectionPoolSize(50)
.database("neo4j")
.credentials("neo4j", "***")
.build();
Configuration userConfiguration = new Configuration.Builder()
.uri("bolt://localhost:7687")
.connectionLivenessCheckTimeout(10)
.connectionPoolSize(50)
.databaseSelectionProvider(new UserDatabase())
.credentials("neo4j", "***")
.build();
this.mainFactory = new SessionFactory(mainConfiguration, "com.caraer.Caraer");
this.userFactory = new SessionFactory(userConfiguration, "com.caraer.Caraer");
this.mainFactory.register(generateUuid);
this.userFactory.register(generateUuid);
this.mainDatabaseSession = mainFactory.openSession();
this.userDatabaseSession = userFactory.openSession();
}
// Static inner class for lazy initialization
private static final class InstanceHolder {
private static final Neo4jService INSTANCE = new Neo4jService();
static {
INSTANCE.init(); // Ensure initialization is done only once
}
}
public static Neo4jService getInstance() {
return InstanceHolder.INSTANCE;
}
public Session getMainSession() {
return InstanceHolder.INSTANCE.mainDatabaseSession;
}
public Session getUserSession() {
return InstanceHolder.INSTANCE.userDatabaseSession;
}
}
class UserDatabase implements DatabaseSelectionProvider {
@Override
public DatabaseSelection getDatabaseSelection() {
User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
if (user == null) {
return null;
} else {
return DatabaseSelection.select(user.getDatabase());
}
}
}