2016-03-31 13 views
0

Ben kimliğiyle anahtarla müşteri nesne önbelleğe istediğiniz yöntemi seviyesi cacheÖrnek alanını önbellek anahtarı olarak mı yapıyorsunuz?

public class Customer { 

private Long id; 

@Cacheable("customer",key="this.id") 
public CustomerAddress findCustomerAddress() {...} 

} 

için org.springframework.cache.annotation.Cacheable kullanıyorum. Ancak, yöntem parametresi olarak kimliğim yok. Örnek alan var mı?

+1

Herbir Müşteri İlkbahar tarafından yönetiliyor mu? Daha genel bir yaklaşım, servislerinizde/DAO katmanında, doğrudan etki alanı nesnelerine değil (genellikle Spring tarafından yönetilemez) '@ Cacheable' kullanmaktır. Başka bir deyişle: 'findCustomerAddress' öğesini hizmet katmanına taşıyarak ve kullanıcı kimliğini giriş parametresi olarak göndererek bu sorunu çözeceksiniz. – kryger

+0

Evet müşteri, baharda yönetilen fasülyedir. Bu kod sadece servis katmanında. Ben sadece ne istediğimi örnek verdi – emilly

+0

CustomerAddress.id önbellek anahtar olarak kullanmak istediğiniz özellik mi? –

cevap

0

Kolayca yapamazsın ve kod yukarıdaki IMO iki kokuları vardır:

  • Bir customer cache
  • nesne önbelleğe çalışıyoruz bir address önbelleğe çalışıyoruz yapar kendi kimliğine sahip görünmüyor. Daha sonra yerine önbelleğe ediyorum Customer (birine sahip olan) Zaten asıl soruya büyük Yorumlar oldu ve kendisine mevcut tasarım incelemenizi öneririm yerine bir alt bileşeni

daha böylece nesne önbellek kendi kimliğine sahiptir. Yapamazsan ya da yapmazsan, her zaman bir yol vardır.

@Cacheable(cacheNames = "customer", keyGenerator="customerKeyGenerator") 
public CustomerAddress findCustomerAddress() {...} 

} 

Ve sonra bazı @Configuration sınıfa

@Bean 
public KeyGenerator customerKeyGenerator() { 

} 

içinde KeyGenerator API yeterince basit. Örneğin, hedef örneğinin Customer olduğunu kontrol edip, ardından id değerini alabilirsiniz.

İlgili konular