2016-03-30 18 views
2

Ben JPA kullanıyorum ve ben benim varlık Manager enjekte ve soyut bir sınıf var ve ben veritabanına benim nesneyi sürdürmek ve tüm hizmetler sınıfında soyut sınıf ama genişletir genel bir yöntem var ben: bazen İstemci ve istemci ayrıntılarını sürdürmek ancak istemcinin ısrarında bir istisna varsa, programım istemci ayrıntılarını devam ettiriyor, bu yüzden devam eden bir istisna olduğumda aramak için bir rollback çağırıyorum.Nasıl @PersistenceContext tarafından enjekte edilen EntityManager'ın bir işleminin geri alınması gerekir?

entityManager.getTransaction().rollback(); gibi yapabildiğimi ancak varlık yöneticimi yönetiyorsam ancak kapsayıcı tarafından yönetildiğimi gösteriyorum.

public abstract class AbstractEntityFactory<E>{ 
protected static final transient Logger LOGGER = CommonLogger.getLogger(AbstractEntityFactory.class); 
@PersistenceContext(unitName = "Test_PU") 
@Transient 
@XmlTransient 
private transient EntityManager entityManager; 

public E persist(final E arg0) { 
    LOGGER.debug("persist : Begin"); 
    this.getEntityManager().persist(arg0); 
    this.getEntityManager().flush(); 
    LOGGER.debug("persist : End"); 
    return arg0;   
} 

}

NB:

İşte benim soyut sınıftır i sunucuya

Geçerli işlem geri UserTransaction.rollback kullanmayı deneyebilirsiniz
+0

yoluyla bunu elde etmek mümkün olmalıdır mi? Ama sonra, sadece 'RuntimeException' atmak işlemi geri almalıdır. Olmuyor mu? –

+0

Herhangi bir kapsayıcı, bir istisna olduğunda işlemi geri alır ve çoğu kalıcılık sağlayıcıları, kalıcılık istisnası oluştuğunda JPR tarafından geri alma işleminin işaretlenmesi için gereklidir. Çözmeyi düşündüğünüz problem hakkında daha fazla bilgi verebilir misiniz? – Chris

cevap

0

olarak JBoss EAP6 var.

+0

hiçbir işlem yapmıyorum hiçbir işlem sonu ve hiçbir comit başlar çünkü kap bunu yapmak ve yukarıda gördüğünüz gibi entityManager tarafından enjekte @PersistenceContext – Abdel

0

Kullandığınız "kapsayıcı". Çılgın gibi bir şey demek istediğini farzediyorum, .. Bu durumda, bir yerde @Transactional kullandığınızı varsayalım. Bu ek açıklamanın rollbackFor adında bir özelliği vardır.

Doğru hatırlıyorsam varsayılan kurulum RuntimeExceptions için geri dönmez. Yani bunu değiştirebilirsin.

Geri yüklemeniz gerekiyorsa, UserTransaction el ile kullanın. o EntityManager enjekte edilir Bahar Sen

public class SomeBean { 

    @Resource 
    private UserTransaction transaction; 
} 
+0

KullanıcıTransaction herhangi bir yerde kullanmayın – Abdel

+0

Ama sen ne zaman istersen İşlemi kontrol etmek için. –

+0

Ben düşünün benim entistManager aracılığıyla benim yöntemimi gördüğünüz gibi ben @ PersistenceContext üzerinden entityManager enjekte juste olduğunu o zaman ben tüm yaptığım bir floş yapmak ve benim persistence.xml içinde: 'işlem tipi = "JTA" ' – Abdel

0
you can use transaction rollback support annotation : 

` @Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class) 
    public E persist(final E arg0) { 
    LOGGER.debug("persist : Begin"); 
    this.getEntityManager().persist(arg0); 
    this.getEntityManager().flush(); 
    LOGGER.debug("persist : End"); 
    return arg0;   
}` 
+0

' @ Transactional (propagation = Propagation.REQUIRED, rollbackFor = Exception.class) 'Spring için mi? çünkü kullanmıyorum ve JPA ve EJB ve CDI kullanıyorum – Abdel

İlgili konular