2016-07-27 10 views
1

Threadクラスは、親クラスがアクセスできるセッションにアクセスできるように設定できますか?Hibernateがプロキシを初期化できませんでした - スレッド内のオブジェクトにアクセスするときセッションがありません

現在、親クラスはSomeObjectを使用していますが、これは複数のSetのオブジェクトを持っています。これらのオブジェクトは、Threadを拡張しているDeviceRunnerによって使用する必要があります。

このアプリケーションは、Spring Boot/Spring Data JPA/Hibernateを使用しています。

更新

はそれが@Controllerのために、私と同じように@Autowirerepositoryすることは可能ですか?以下に示す@Autowiredrepositoryはnullを返します。

@Transactionalを設定すると、SomeObjectのオブジェクトを処理することができましたが、RepositoryAutowireに取得できないため、作成/保存できますか?

@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 .... 

} 

コードSomeObjectの

@Data 
@Entity 
@Table(name = "test_run") 
public class SomeObject { 

    @ManyToMany(fetch = FetchType.LAZY) 
    private Set<OtherObjects> otherObjects; 

} 

TestRunRepository

012:

はスレッドを拡張

コードDeviceRunnerありがとうスレッドを作成

@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()); 
    } 
} 
+0

スレッドからSomeObjectを変更する必要がありますか、それともそれを読み取るだけですか? – takteek

+0

呼び出しメソッドで@Transactional(readOnly = true)が欠落していませんか? – Sarief

答えて

1

伝播を使用してトランザクションを必須として指定することができます。これはデフォルトです。 @Transactional(Propagation.REQUIRED)

+0

Transactional(Propogation.REQUIRED)を設定するときにこれを行う必要があります。これはSomeObjectからオブジェクトにアクセスできるようになっているように見えますが、リポジトリが正しくオートワイヤリングされていないため、スレッドでアクセスできません。上記のコードを更新しました – ALM

1

私はあなたのリポジトリクラスに@AutowiredのEntityManagerまたはセッションを追加します。できます。 Springのデータは、トランザクションコンテキスト(つまり、現在実行中のスレッドを呼び出すスレッドに依存)に応じて、実際のEntityManager/Sessionを生成するプロキシを挿入します。

+0

上記のようにAutowiredを設定しても、リポジトリをクラスに接続することはできませんでした。私はこれを違うようにしなければなりませんか?現在、私はコンストラクタの一部としてそれを渡していますが、autowiredにすることを好むでしょう。 – ALM

+0

'@Autowired Repository(EntityManager em)'や '@Autowired void setEntityManager(EntityManager em)'やフィールド(テスト容易性の観点から推奨されていない)のようなコンストラクタに注釈を付けます。 3つの方法すべてがうまくいくはずです。 – Alexander

関連する問題