2011-06-23 14 views
5

Bir yöntem içinde olmayan bir işlem gerektiren bir yöntemi çağırabilir misiniz?@TransactionAttribute (value = TransactionAttributeType.NEVER) yöntemini bir yöntemde kullanma

@TransactionAttribute(value = TransactionAttributeType.NEVER) 
public void DoSomething(final List<Item> items) { 

//can you call a method that requires a transaction here ? 
for (Item i : items) { 
    methodCall(item); 

} 

@TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW) 
public void methodCall(final Item item) { 
    // access lazily loaded item properties 
    item.getSalesOrder(); 
    item.getAllocation(); 

    //throws org.hibernate.LazyInitializationException: could not initialize proxy - no Session 

} 

.NEVER nitelik o yöntemle

+0

@TransactionAttribute ek açıklamasını sınıf düzeyindeki kurumsal bean'ın tüm iş yöntemleri için varsayılan işlem özniteliğini belirtmek üzere uygulayabilirsiniz. Bu yöntemin işlem özniteliğini belirtmek için bu açıklamayı yöntem düzeyinde uygulayabilirsiniz. Ek açıklama yöntemini yöntem düzeyinde uygulamak, bu yöntem için (varsa) sınıf düzeyi ek notunu geçersiz kılar. – Luke

cevap

9

açıklama yalnızca bulunması gerekir gerekli işlem durumunu tanımlar içindeki diğer yöntemlere aramalarla ilgili bir hareket içinde çalışmaz yöntemi ama ne garanti altına alacaktır açıklamalı yöntem çağrılır (bu durumda bir işlem mevcut olmamalıdır). Açıklamalama yönteminin yürütülmesinde neler olabileceğini kısıtlamaz. Dolayısıyla bu yöntemde yeni bir işlemi sorunsuzca başlatabilirsiniz.

Sağladığınız örnekte, ASLA işlemsel ayarı olan bir yöntem içinden işlem gerektiren bir yöntemi çağırabilirsiniz. Bu durumda, işlemi gerektiren yöntem çağrısı için yeni bir işlem oluşturulacaktır. İç yöntem bir MANDATORY ayarıyla işaretlenmişse, mevcut bir işlem olmadığından ve MANDATORY ayarı sizin için otomatik olarak oluşturmadığından iç yöntem çağrısı başarısız olur.

+0

Bunu temizlediğiniz için teşekkür ederiz. Neden işe yaramayacağına dair bir neden göremedim ancak içsel yöntem çağırma içerisindeki tembel yüklü özelliklere erişemiyorum (yeni bir açıklama eklense bile) – Luke

+0

Üst düzey fasulyeniz iç fasülyeye nasıl erişti ('itemBean ')? 'ItemBean' konteyneri de iyi yönetiliyor mu ya da doğrudan bunu gerçekleştirdiniz mi (işlem ek açıklamaları yalnızca yönetilen çekirdeklerde destekleniyor)? Ayrıca, atıfta bulunduğunuz tembel yüklenen özellikler nelerdir ve bunlar işlemle nasıl ilişkilendirilir (hiç değilse)? –

+0

Her bir öğenin, bu özel işlemle ilgisi olmayan diğer özelliklerin yanı sıra temkinli yüklenen bir satış ve tahsisatı vardır. Bu durumda her iki yöntem de aynı fasülyedir, bu yüzden kod örneğimde itemBean öneki bulunmamalıdır. – Luke