Generics ile bir Hazırda Bekletme DAO'sunun nasıl oluşturulacağına ilişkin birkaç eğitici buldum, ancak hepsi SessionFactory
yerine EntityManager
kullanıyor. Sorum şu: SessionFactory
kullanarak jeneriklerle DAO nasıl kurulur. Bugüne kadar aşağıda var:Generics ile Hazırda Beklet DAO nasıl uygulanır
Arayüz:
public interface GenericDao<T> {
public void save(T obj);
public void update(T obj);
public void delete(T obj);
public T findById(long id);
}
Sınıf:
@Repository
public class GenericDaoImpl<T> implements GenericDao<T> {
@Autowired
private SessionFactory sessionFactory;
public void save(T obj) {
Session session = sessionFactory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
session.save(obj);
tx.commit();
} catch (HibernateException e) {
if(tx != null)
tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
}
public void update(T obj) {
Session session = sessionFactory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
session.update(obj);
tx.commit();
} catch (HibernateException e) {
if(tx != null)
tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
}
public void delete(T obj) {
Session session = sessionFactory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
session.delete(obj);
tx.commit();
} catch (HibernateException e) {
if(tx != null)
tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
}
public T findById(long id) {
// ??
return null;
}
Ben yaklaşık findById
kullanarak jeneriği gitmek nasıl emin değilim. Diğer yöntemlerin doğru olduğuna inanıyorum ama yanılıyorsam beni düzelt.
YAN SORU:SessionFactory
kullanmaktan daha yararlı EntityManager
kullanıyor mu? Konuyla ilgili birkaç yazı gördüm, ancak birkaç fikir daha istiyorum.
Java'da, jenerikler silme işlemi ile uygulanır ve "T" biçiminiz, çalışma zamanında 'T' nesnesi olur. Diğer bir deyişle, çalışma zamanında "T" tipi mevcut değildir. Yeni basılan bir "T" örneğini döndüren herhangi bir genel yöntem, bu nedenle, yöntemin, oluşturması gereken örnek türünü yansıtmak üzere kullanabileceği bir çalışma zamanı türü belirtecini gerektirir. 'FindById (...)' için daha pratik bir imza bu nedenle 'public T findById (Sınıf sınıfı, uzun kimlik)' dir. –
scottb
@scottb bu yüzden Class belirteci, yöntemin hangi tür nesnenin geri dönmesi gerektiğini belirlemek için kullanılacaktır? Bu konuda tam olarak nasıl giderim?EntityManager örnekleri ile entityManager.find (type.class, id) 'yi gördüm, ancak bunu SessionFactory ile nasıl yapacağımı bilmiyorum. –
Geri dönmeniz gereken türün argüman içermeyen bir kurgulayıcısına sahip olması durumunda, rasgele bir tür olan "T" nin yeni bir örneğini dinamik olarak karıştırmanın en kolay yolu, " Sınıfının" newInstance() yöntemini kullanmaktır. " Örneğin. T myObj = class.newInstance(); '. Aksi takdirde, argümanlarla uygun bir yapıcıyı çağırmak için 'Class ' nesnesi aracılığıyla yansımayı kullanmanız gerekebilir. Böyle bir yöntemde, "Sınıf Sınıfında" sınıfı, * çalışma zamanı türü belirtecinin * rolünü oynar. Java'da, bazen tam olarak gerekli çünkü jenerik türleri çalışma zamanında mevcut değildir. –
scottb