2012-03-26 15 views
1

Hibernateを使用するWebアプリケーションがありますが、一部のデータを永続化しようとしていますが、@ Transactionalアノテーションを使用していてもトランザクション内で永続化できません。次のようにHibernate @トランザクションがトランザクションを開始しない

マイサービスクラスがある:

@Service("profileService") 
public class ProfileService { 
    private EntityManager entityManager; 

    @Autowired 
    private AccountService accountService; 

    @Autowired 
    private ProfileDAOImpl profileDao; 

    @PersistenceContext 
    public void setEntityManager(EntityManager em) { 
     this.entityManager = em; 
    } 

    @Transactional 
    public void addConnectionToAccount(SocialConnection sc) { 
     entityManager.persist(sc); 
    } 

} 

addConnectionToAccount()メソッドは、通常の方法で他のSpring Beanから呼び出され、及びProfileServiceにクラスが現在存在注入されている:

public class HibernateConnectionRepository implements ConnectionRepository { 

    @Inject 
    private ProfileService profileService; 

    @Override 
    @Transactional 
    public void addConnection(SocialConnection sc) { 
     try { 
      profileService.addConnectionToAccount(accountId, sc); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

@Transactionalアノテーションを呼び出しメソッドに置いてみましたが、何も違いはないかもしれないということを無駄にしていました。

以前は、永続化されているオブジェクトがテーブルの制限(ヌルとしてnullを許可しない列など)を満たしていないか、メソッドが同じクラス内から呼び出されているため呼び出しメソッドがトランザクションではありませんが、どちらも該当しません。

次のようにそれだけで静かに失敗し、ログには、次のとおりです。

2012-03-26 22:25:04,702 [http-bio-8085-exec-9] DEBUG com.mchange.v2.resourcepool.BasicResourcePool - trace [email protected] [managed: 3, unused: 2, excluded: 0] (e.g. [email protected]) 
2012-03-26 22:25:04,710 [http-bio-8085-exec-9] DEBUG org.hibernate.SQL - select SEQ_COUNT from SEQUENCE where SEQ_NAME = 'PO_SEQ' for update 
2012-03-26 22:25:04,711 [http-bio-8085-exec-9] DEBUG org.hibernate.SQL - update SEQUENCE set SEQ_COUNT = ? where SEQ_COUNT = ? and SEQ_NAME = 'PO_SEQ' 
2012-03-26 22:25:04,723 [http-bio-8085-exec-9] DEBUG com.mchange.v2.resourcepool.BasicResourcePool - trace [email protected] [managed: 3, unused: 2, excluded: 0] (e.g. [email protected]) 
2012-03-26 22:25:04,723 [http-bio-8085-exec-9] DEBUG org.hibernate.event.internal.AbstractSaveEventListener - Generated identifier: 2200, using strategy: org.hibernate.id.MultipleHiLoPerTableGenerator 

UPDATE

はまたHibernateConnectionRepository Beanが注釈されていないことを言及したかったし、実際に@Configurationクラスで構成されています(何か違いがある場合は@Configurationクラスをあまり使わない)。

@Bean 
@Scope(value = "request", proxyMode = ScopedProxyMode.INTERFACES) 
public ConnectionRepository connectionRepository() { 
    Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 
    if (authentication == null) { 
     throw new IllegalStateException("Unable to get a ConnectionRepository: no user signed in"); 
    } 
    ApplicationUser user = (ApplicationUser) authentication.getPrincipal(); 
    return usersConnectionRepository().createConnectionRepository(String.valueOf(user.getAccountId())); 
} 

Beanがログインしているユーザーにスコープされていますが、ユーザーごとに複数回作成することができる。..それでも

答えて

0

エラーが正しく発射されないという問題がありました。

この問題に関連する:Let eclipse use maven to compile/weave my codeは、新しいバージョンのEclipseとM2Eを使用して発生します。

Eclipseのクリーンアップでは側面が織り込まれていなかったため、トランザクションアノテーションは織り込まれていませんでした。それはobviosuly断続的に働いていたので、私は通常のmavenのクリーンインストール(コマンドラインなど)織りが行われていたので(Eclipseはきれいにしていないので、私はmavenをきれいにインストールしてEclipseを再構築したうまくいかない)。

EclipseでAspectJ Builderをプロジェクトに追加することでこれを修正しました。これで、クリーン/ビルドを自動的に実行するときに正しくビルドされます。

1

いくつかのもの:次のように

Beanを作成する方法があります(あなたが制約との良好なスタートを持っているし、同じBeanからの呼び出しが)を見て:

  • は、XMLファイル内に存在<tx:annotation-driven />
  • です
  • トランザクションが開始されていないことは確実ですか? TransactionSynchronizationManager.isActualTransactionActive()で確認してください。
+0

yep、アノテーション駆動型の設定(プロキシではなくモードとしてaspectJを使用)を使用してください。以前はentityManager.flush()を追加しようとしました。永続的な呼び出しの後に私は "トランザクションが進行中ではありません"というエラーが出ましたが、あなたの提案されたコードで確認します。ありがとうございます - それがどのように動作するのかをお知らせします – rhinds

+0

いいえ、トランザクション同期マネージャを使ってチェックしました - 間違いなくトランザクション。しかし、それは見知らぬ人になってしまいました。私はentityManager.flush()を追加して以前にテストしました。(トランザクションエラーはありませんでした)、私はflush呼び出しを削除してプロジェクトをクリアしました/ Eclipseを再起動して、 (それを証明するためにDBの行を持っている) - しかし、それ以上の試みは失敗し、何か他のものを保持することはできません(再洗浄/再起動などを試みました)。なぜトランザクションは時々始まるが常にではないのだろうか? – rhinds

+0

私が行うことができないプロジェクト全体を見るまではない。しかし、あなたはaspectJに言及しました - 代わりにプロキシモードを使用してみてください。 – Bozho

関連する問題