Java Hibernate无法初始化代理-访问线程内的对象时没有会话
如何设置我的Java Hibernate无法初始化代理-访问线程内的对象时没有会话,java,spring,multithreading,hibernate,spring-data,Java,Spring,Multithreading,Hibernate,Spring Data,如何设置我的线程类,使其能够访问父类有权访问的会话 当前父类正在使用具有多个对象集的SomeObject。扩展线程的DeviceRunner需要使用这些对象 此应用程序使用Spring引导/Spring数据JPA/Hibernate 更新 是否可以像对待@Controller一样@Autowire存储库?如下所示的@Autowired存储库返回空值 设置@Transactional允许我处理SomeObject的对象,但我无法将存储库转到自动连线以便创建/保存 多谢各位 代码设备运行程序扩展线程
线程
类,使其能够访问父类有权访问的会话
当前父类正在使用具有多个对象集的SomeObject
。扩展线程的DeviceRunner
需要使用这些对象
此应用程序使用Spring引导/Spring数据JPA/Hibernate
更新
是否可以像对待@Controller
一样@Autowire
存储库
?如下所示的@Autowired
存储库
返回空值
设置@Transactional允许我处理SomeObject的对象,但我无法将存储库
转到自动连线
以便创建/保存
多谢各位
代码设备运行程序扩展线程:
@Transactional(propagation=Propagation.REQUIRED)
public class DeviceRunner extends Thread {
@Autowired
public TestRunRepository repository;
public SomeObject object;
private .....
public DeviceRunner(args.... ) {
// set private variables
}
public void run() {
// do stuff
}
synchronized ....
}
对某个对象进行编码
@Data
@Entity
@Table(name = "test_run")
public class SomeObject {
@ManyToMany(fetch = FetchType.LAZY)
private Set<OtherObjects> otherObjects;
}
我会将@Autowired EntityManager或Session添加到您的存储库类中。它起作用了。Spring数据注入一个代理,该代理生成实际的EntityManager/会话,具体取决于事务上下文(即,取决于当前正在执行的调用它的线程)。您可以根据需要使用带有传播的事务,这是默认事务。
@Transactional(Propagation.REQUIRED)
您需要修改线程中的某个对象还是只读取它?在设置Transactional(Propogation.REQUIRED)时,您确定调用方法中没有缺少@Transactional(readOnly=true)吗是否需要在上执行此操作看起来正在工作以允许我从某个对象访问对象,但存储库未正确自动连接,因此我无法在线程中访问它们。我已经更新了上面的代码,如上所示设置Autowired不允许将存储库连接到类。我必须用不同的方式来做吗?目前,我将其作为构造函数的一部分传递,但更希望将其自动连接。可以对构造函数(如“@autowired Repository(EntityManager em)”)或setter(如“@autowired void setEntityManager(EntityManager em)”)或字段(从可测试性的角度来看,建议较少)进行注释。这三种方法都应该有效。
@Repository
@Transactional
public interface TestRunRepository extends PagingAndSortingRepository<TestRun, Long> {
}
@Transactional(propagation=Propagation.REQUIRED)
@RestController
public class HomeController {
@Autowired
public TestRunRepository repository;
....
@Transactional
private void runTestRunOnDevice(TestRun testRun) {
DeviceRunner deviceRunner = new DeviceRunner(testRun);
deviceRunner.start();
while (deviceRunner.isAlive());
}
}