Anıl Şenocak

@Entity
@Getter
@Setter
@Builder
@NoArgsConstructor
@Table(name = "transactions", uniqueConstraints = {
@UniqueConstraint(columnNames = {"id"})
})
@AllArgsConstructor
@EntityListeners(Transaction.TransactionListeners.class)
public class Transaction{
@Id
@GeneratedValue(generator = "UUID")
@GenericGenerator(
name = "UUID",
strategy = "org.hibernate.id.UUIDGenerator"
)
@Column(name = "id", updatable = false, nullable = false)
private String id;
@Column
private String name;
public static class TransactionListeners {
@PrePersist
public void onPrePersist(final Transaction transaction) {
transaction.setId(UUID.randomUUID().toString());
}
}
}
Bu bizim java'nın bize sunduğu bir Entity sınıfı, görüldüğü gibi,
@EntityListeners(Transaction.TransactionListeners.class) İle işaretlenmiş bir inner sınıfımız var, bu sınıf entity'e herhangi bir işlem gerçekleştiğinde çalışacak olan sınıftır. Ancak bu sınıf içerisinde herhangi bir bean'e(reposiotory yada servis katmanı) erişmek istediğimizde ne olur?
Mesela bu tablo'ya bir kayıt eklendiğinde başka bir tabloda güncelleme işlemi yapmak istiyoruz? Bu durumda Spring Autowired gibi dependency injection yapamayacak çünkü burayı spring yönetmiyor. Yapmamız gereken ApplicationContext içerisinde bean'i çekmemiz gerekecek.
Bu durumda aşağıdaki servis ile işimizi yapabiliriz.
@Service
public class ContextWrapper implements ApplicationContextAware {
private static ApplicationContext applicationContext;
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
public static Object getBean (String beanId) {
return applicationContext.getBean(beanId);
}
}
Bu kadar, yapmamız gereken tek şey;
AccountRepository accountRepository = (AccountRepository) ContextWrapper.getBean("accountRepository");