В моем пути изучения гибернации я наткнулся на статью на сайте гибернации . Я тоже изучаю Spring и хотел сделать определенные вещи, чтобы раскрыть гибкость Spring, позволяя вам реализовать свой собственный сеанс. Да, я не хочу использовать hibernateTemplate (для эксперимента). и теперь у меня есть проблема и даже тестовый класс. Я следил за статьей на сайте hibernate, особенно за разделом "реализация с hibernate"
Итак, у нас есть универсальный дао-интерфейс:
public interface GenericDAO<T, ID extends Serializable> {
T findById(ID id, boolean lock);
List<T> findAll();
List<T> findByExample(T exampleInstance);
T makePersistent(T entity);
void makeTransient(T entity);
}
это реализация в абстрактном классе, аналогичном классу на веб-сайте. Пожалуйста, обратитесь к нему по предоставленной мной ссылке. Я хочу сохранить этот пост слишком длинным
теперь пришло сообщение от моего дао в сообщении
package com.project.core.dao;
import com.project.core.model.MessageDetails;
import java.util.List;
public interface MessageDAO extends GenericDAO<MessageDetails, Long>{
//Message class is on of my pojo
public List<Message> GetAllByStatus(String status);
}
его реализация представлена в сообщении:
public class MessageDAOImpl extends GenericDAOImpl <Message, Long> implements MessageDAO {
// mySContainer is an interface which my HibernateUtils implement
mySContainer sessionManager;
/**
*
*/
public MessageDAOImpl(){}
/**
*
* @param sessionManager
*/
public MessageDAOImpl(HibernateUtils sessionManager){
this.sessionManager = sessionManager;
}
//........ plus other methods
}
вот мой HibernatUtils
public class HibernateUtils implements SessionContainer {
private final SessionFactory sessionFactory;
private Session session;
public HibernateUtils() {
this.sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
}
public HibernateUtils(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
/**
*
* this is the function that return a session.So i'm free to implements any type of session in here.
*/
public Session requestSession() {
// if (session != null || session.isOpen()) {
// return session;
// } else {
session = sessionFactory.openSession();
// }
return session;
}
}
Таким образом, в моем понимании при использовании spring (предоставит conf) я подключу sessionFactory к моему HiberbernateUtils, а затем подключу его метод RequestSession к свойству Session свойства GenericDAOImpl (тот, который предоставлен по указанной ссылке).
вот мой весенний конфиг core.xml
<bean id="sessionManager" class="com.project.core.dao.hibernate.HibernateUtils">
<constructor-arg ref="sessionFactory" />
</bean>
<bean id="messageDao" class="com.project.core.dao.hibernate.MessageDAOImpl">
<constructor-arg ref="sessionManager"/>
</bean>
<bean id="genericDAOimpl" class="com.project.core.dao.GenericDAO">
<property name="session" ref="mySession"/>
</bean>
<bean id="mySession" factory-bean="com.project.core.dao.SessionContainer" factory-method="requestSession"/>
Теперь мой тест это
public class MessageDetailsDAOImplTest extends AbstractDependencyInjectionSpringContextTests{
HibernateUtils sessionManager = (HibernateUtils) applicationContext.getBean("sessionManager");
MessageDAO messagedao =(MessageDAO) applicationContext.getBean("messageDao");
static Message[] message = new Message[]
{
new Message("text",1,"test for dummies 1","1234567890","Pending",new Date()),
new Message("text",2,"test for dummies 2","334455669990","Delivered",new Date())
};
public MessageDAOImplTest() {
}
@Override
protected String[] getConfigLocations(){
return new String[]{"file:src/main/resources/core.xml"};
}
@Test
public void testMakePersistent() {
System.out.println("MakePersistent");
messagedao.makePersistent(message[0]);
Session session = sessionManager.RequestSession();
session.beginTransaction();
MessageDetails fromdb = ( Message) session.load(Message.class, message[0].getMessageId());
assertEquals(fromdb.getMessageId(), message[0].getMessageId());
assertEquals(fromdb.getDateSent(),message.getDateSent());
assertEquals(fromdb.getGlobalStatus(),message.getGlobalStatus());
assertEquals(fromdb.getNumberOfPages(),message.getNumberOfPages());
}
У меня эта ошибка
исключение в конструкторе testMakePersistent (java.lang.NullPointerException в com.project.core.dao.hibernate.MessageDAOImplTest)
с этим стеком: в com.project.core.dao.hibernate.MessageDAOImplTest. (MessageDAOImplTest.java:28)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0 (собственный метод)
в sun.reflect.NativeConstructorAccessorImpl.newInstance (NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance (DelegatingConstructorAccessorImpl.java:27)
в java.lang.reflect.Constructor.newInstance (Constructor.java:513)
в junit.framework.TestSuite.createTest (TestSuite.java:61)
в junit.framework.TestSuite.addTestMethod (TestSuite.java:283)
на junit.framework.TestSuite. (TestSuite.java:146)
в org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run (JUnitTestRunner.java:481)
в org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch (JUnitTestRunner.java:1031)
в org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main (JUnitTestRunner.java:888)
))
Как на самом деле заставить это работать. Я знаю, что это очень много для вещей, и я благодарю вас за чтение. Пожалуйста, дайте мне решение. Как бы вы это сделали? спасибо