QuestionとFavoritesCounterの2つのエンティティがあります。質問が初めてお気に入りに追加されるときに、FavoritesCounterを作成する必要があります。
2人のユーザーがお気に入りに質問を同時に追加しようとするユースケースを考えてみましょう。これにより、2番目のユーザーが呼び出されたEntityExistsException
ときに発生します。entityManager.persist(counter)
ただし、以下のコードは機能しません。これは、EntityExistsException
がスローされると、コンテナがトランザクションをロールバックとしてのみマークし、戻りの試行getFavoritesCounter(question)
が失敗するためです。javax.resource.ResourceException: Transaction is not active
@Stateless
public class FavoritesServiceBean implements FavoritesService {
...
public void addToFavorites(Question question) {
FavoritesCounter counter = getCounter(question);
if (counter == null) {
counter = createCounter(question);
}
//increase counter
}
private FavoritesCounter createCounter(Question question) {
try {
FavoritesCounter counter = new FavoritesCounter();
counter.setQuestion(question);
entityManager.persist(counter);
entityManager.flush();
return counter;
} catch (EntityExistsException e) {
return getFavoritesCounter(question);
}
}
private FavoritesCounter getFavoritesCounter(Question question) {
Query counterQuery = entityManager.createQery("SELECT counter FROM FavoritesCounter counter WHERE counter.question = :question");
counterQuery.setParameter("question", question);
List<FavoritesCounter> result = counterQuery.getResultList();
if (result.isEmpty()) return null;
return result.get(0);
}
}
質問
@Entity
public class Question implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
//getter and setter for id
}
FavoriteCounter
@Entity
public class FavoritesCounter implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToOne
@Column(unique = true)
private Question question;
//getter and setter
}
作成済みのエンティティを後で返すための最良の方法は何EntityExistsException
ですか?