1

ユーザーが複数の人にメッセージを送信できるという要件に取り組んでいます。これらのメッセージをメッセージ テーブルに保存する必要があります。
オブジェクトの永続化に JPA entityManager を使用し、永続化プロバイダーとして Hibernate と Spring 宣言型トランザクション管理を使用しています。

persist() メソッドを 3 回実行しても、テーブルに 1 行しか保存されません。すべてのメッセージを保存するにはどうすればよいかわかりません。例外メッセージは表示されません。

以下は、applicationContext.xml での宣言型トランザクション管理構成です。

  <tx:advice id="txAdvice" >

    <tx:attributes>

        <tx:method
            name="*"
            propagation="REQUIRED" />
    </tx:attributes>
</tx:advice>

<aop:config>

    <aop:pointcut
        id="messageServiceOperation"
        expression="execution(* com.abhinow.message.services.*.*(..))" />

    <aop:advisor
        advice-ref="txAdvice"
        pointcut-ref="messageServiceOperation" />
</aop:config>

以下は、私のサービスクラス MessageService.java のコードです

  private void saveMultipleMessages(SentMessage message) {
    String[] toAddresses = message.getMultipleDestinations().split(",");
    for(String to: toAddresses) {
        message.setTo(to);
    saveMessage(message);
    }
}

public void saveMessage(SentMessage message) {
    messageRepository.saveSentMessage(message);
}

以下は私の MessageRepository.java のコードです

  @Repository
  public class MessageRepository {

   @PersistenceContext
   EntityManager entityManagerFactory;

   public void saveSentMessage(SentMessage message) {

    entityManagerFactory.persist(message);

    }
      }

どんな助けでも大歓迎です。前もって感謝します

4

1 に答える 1

1

for ループで同じ SentMessage オブジェクトを再利用しているようです。私の推測では、JPA はこのオブジェクトを既に永続化していることを検出し、再度永続化することはありません。

次のようなことを試してください:

private void saveMultipleMessages(SentMessage message) {
    String[] toAddresses = message.getMultipleDestinations().split(",");
    for(String to: toAddresses) {
        SentMessage toSave = message.withToAddress(to);
        saveMessage(toSave);
    }
}

" withToAddress" は、現在のオブジェクトに基づいて新しい SentMessage オブジェクトを作成しますが、to アドレスは異なります。この手法を使用すると、SentMessage を不変にすることができます。これには、多くの場合、可変オブジェクトよりも利点があります。

于 2012-11-26T08:30:24.077 に答える