当前位置: 首页 > 知识库问答 >
问题:

Spring Data Neo4j InvalidDataAccessapiUSAGEException:事务不是该线程的当前事务

林正平
2023-03-14
@Configuration
@EnableWebMvc
@ComponentScan({"eu.bm"})
@EnableNeo4jRepositories("eu.bm.repository")
@EnableTransactionManagement
public class bmConfiguration extends WebMvcConfigurerAdapter {

@Bean
public OpenSessionInViewInterceptor openSessionInViewInterceptor() {
    OpenSessionInViewInterceptor openSessionInViewInterceptor =
            new OpenSessionInViewInterceptor();
    openSessionInViewInterceptor.setSessionFactory(sessionFactory());
    return openSessionInViewInterceptor;
}

public void addInterceptors(InterceptorRegistry registry) {
    registry.addWebRequestInterceptor(openSessionInViewInterceptor());
}

@Bean
public static SessionFactory sessionFactory() {
    return new SessionFactory("eu.bm.domain");
}

@Bean
public Neo4jTransactionManager transactionManager() throws Exception {
    return new Neo4jTransactionManager(sessionFactory());
}
@Repository
public interface UserRepository extends GraphRepository<User>{

@Query("MATCH (user:User) where user.name={0} return user ")
User findUser(String username);

@Query("MATCH (user:User) where user.name={0} delete user ")
User deleteUser(String username);

@Query("match (user:User) delete user")
User deleteAllUsers();

}
@Component
public interface UserManagementService {

List<User> listAll();

User save(User user);

User findUser(String username);
}
@Service
@Transactional
public class UserManagementServiceImpl implements UserManagementService {

private UserRepository userRepository;

@Autowired
public UserManagementServiceImpl(UserRepository userRepository) {this.userRepository = userRepository;}

@Override
public List<User> listAll() {
    List<User> users = new ArrayList<>();
    userRepository.findAll().forEach(users::add);
    return users;
}

@Override
public User save(User user) {
    userRepository.save(user);
    return user;
}

@Override
public User findUser(String username) {
    return userRepository.findUser(username);
}

然后执行一个简单的写-读测试,如下所示:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class DatabaseConnectionTest {

// User 1
private static final String UNAME1 = "Paul";
private static final String EMAIL1 = "paul@user.com";
private static final String PASSWORD1 = "p@ss";
private static final String USERNAME1 = "paul";

@Autowired
private UserRepository userRepository;

@Before
public void setUp() throws Exception {

    // Clear database before adding new user
    userRepository.deleteAllUsers();

    // Creating user
    User user = new User(UNAME1, USERNAME1, PASSWORD1, EMAIL1);
    userRepository.save(user);
}

@Test
public void testPersistence() {

    Assert.assertEquals(UNAME1, userRepository.findUser(UNAME1).getName());
    Assert.assertEquals(USERNAME1, userRepository.findUser(UNAME1).getUsername());

}

上面的结果就是这个错误:

2017-08-16 14:59:38.990信息6496---[main]E.B.repository.DatabaseConnectionTest:7.131秒内启动DatabaseConnectionTest(JVM运行于8.331)2017-08-16 14:59:39.872信息6496---[main]o.n.o.drivers.http.request.httprequest:Thread:1,URL:http://localhost:7474/db/data/transaction/39,请求:{“语句”:[{“语句”:“Unwind{rows}as row CREATE(n:user f,ID(n)为ID,row.type为type”,“parameters”:{“rows”:[{“noderef”:-1821370276,“type”:“node”,“props”:{“password”:“p@ss”,“name”:“paul”,“email”:“paul@user.com”,“username”:“paul”}}]},“resultdatacontents”:[“row”],“includestats”:false}]}2017-08-16 14:59:40.358错误6496---[main]

  • 为什么userrepository.save(user)在数据库中创建记录但抛出异常
  • “此线程的事务不是当前的”是什么意思?
  • 为什么userrepository.save(user)最终失败,但userrepository.deleteallusers()工作?

编辑:我的受抚养人。Gradle包括以下内容:

compile group: 'org.springframework.boot', name: 'spring-boot-starter-data-neo4j', version: '1.5.6.RELEASE'
//compile group: 'org.springframework.data', name: 'spring-data-neo4j', version: '4.2.6.RELEASE'
compile group: 'org.neo4j', name: 'neo4j-ogm-core', version: '2.1.3'
//compile group: 'org.neo4j', name: 'neo4j-ogm-bolt-driver', version: '2.1.3'
runtime group: 'org.neo4j', name: 'neo4j-ogm-http-driver', version: '2.1.3'
compile('org.springframework.boot:spring-boot-starter-security')
compile('org.springframework.boot:spring-boot-starter-thymeleaf')
compile('org.springframework.boot:spring-boot-starter-web')
compile group: 'org.springframework.boot', name: 'spring-boot-starter-actuator', version: '1.5.4.RELEASE'
testCompile('org.springframework.boot:spring-boot-starter-test')

共有1个答案

巫晋鹏
2023-03-14

您的SessionFactorybean不应声明为static:

@Bean
public static SessionFactory sessionFactory() {
    return new SessionFactory("eu.bm.domain");
}

应该是

@Bean
public SessionFactory sessionFactory() {
    return new SessionFactory("eu.bm.domain");
}

背景

 类似资料:
  • 在Ignite缓存中的事务性方法中,我们使用多线程方法。

  • 尝试使用executeUpdate()插入/update/delete时引发异常。Select query工作得很好。我已经尝试了以前在Stack-Overflow中提到的类似错误的所有建议。感谢任何指导。 环境:Websphere Liberty:17.0.0.2、Eclipselink 2.6.4、JPA 2.1 在Liberty server上启用的功能 [审核]CWWKF0012I:服务器

  • 此错误发生在,当方法运行时。 向添加注释不能解决问题-https://stackoverflow.com/a/32552558/3536552 你知道怎么修吗?

  • 我有一个带有异步endpoint的quarkus应用程序,它创建一个具有默认属性的实体,在request方法中启动一个新线程,并执行一个长期运行的作业,然后返回该实体作为响应供客户端跟踪。 此外,长时间运行的作业将在实体运行时对其进行更新,因此它也必须是事务性的。但是,数据库实体没有得到更新。 这些是我面临的问题: 收到以下警告: 我尝试使用但没有用。 我尝试在上使用API方法,而不是在指南中提到

  • 问题内容: 我从xml-转换为Java-Config的Spring4 / Hibernate4项目遇到以下异常。 该项目在Eclipse中启动了属性并且没有错误,但是在第一个请求出现Exception时。在我-class我已经配置为,,,。 我所有的服务都标有。 知道这可能来自哪里吗? 编辑1 根据要求,这里是堆栈跟踪: 编辑2 奇怪的是,我从另一个项目中完美地借用了整个Java-Config代码

  • 我将一个Spring4/Hibernate4项目从xml-config转换为Java-config时遇到以下异常。 项目在Eclipse中启动upproperty和errorfree,但在第一个请求时出现异常。在我的类中,我为、、、配置了。 我的所有服务都用注释。 知道这是从哪来的吗? 编辑%1 根据要求,这里的StackTrace: 编辑2 奇怪的是,我从另一个工作完美无缺的项目中借用了整个Ja