У меня есть модуль библиотеки, который я хочу использовать для хранения моделей Hibernate. Я прошу иметь пакет Spring WAR, который я хочу использовать.
Основная весенняя война:
@Configuration
@EnableTransactionManagement
public class ContextDatasource {
@Bean
public LocalSessionFactoryBean sessionFactory() throws NamingException {
final LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
sessionFactory.setDataSource(dataSource());
sessionFactory.setPackagesToScan(new String[] { "org.plugin.database.models" });
sessionFactory.setHibernateProperties(hibernateProperties());
return sessionFactory;
}
@Bean
public DataSource dataSource() throws NamingException {
return (DataSource) new JndiTemplate().lookup("java:/global/production_gateway");
}
@Bean
public PlatformTransactionManager hibernateTransactionManager() throws NamingException {
final HibernateTransactionManager transactionManager = new HibernateTransactionManager();
transactionManager.setSessionFactory(sessionFactory().getObject());
return transactionManager;
}
@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
return new PersistenceExceptionTranslationPostProcessor();
}
private final Properties hibernateProperties() {
final Properties hibernateProperties = new Properties();
return hibernateProperties;
}
}
Библиотека DAO:
public class BlacklistsDaoHibernate implements BlacklistsDao {
Session session;
@Autowired
SessionFactory sessionFactory;
public BlacklistsDaoHibernate() {
session = sessionFactory.getCurrentSession();
}
@Override
public void saveOrUpdate(BlacklistsModel blacklistsModel) throws Exception {
try {
session.getTransaction().begin();
session.saveOrUpdate(blacklistsModel);
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
throw new Exception("Error");
}
}
Но я получаю NPE на этой строке session = sessionFactory.getCurrentSession();
Как правильно использовать sessionFactory в модуле Library Jar?
Как предполагается, что sessionFactory должен быть установлен до завершения конструктора, то есть до того, как экземпляр BlacklistsDaoHibernate даже существует для работы?
@ luk2302 следует использовать @Postconstruct?
Нет, вам следует использовать инъекцию конструктора.
@ luk2302 не могли бы вы опубликовать пример кода?




Вы можете использовать @PostConstruct или внедрение конструктора. Spring создает экземпляр вашего объекта, тогда разрешает его поля @Autowired. Вы можете попросить, чтобы он разрешил зависимости вашего объекта до создания экземпляра объекта с помощью внедрения конструктора.
С внедрением конструктора:
SessionFactory sessionFactory;
Session session;
public BlacklistsDaoHibernate(@Autowired SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
this.session = sessionFactory.getCurrentSession();
}
С @PostConstruct:
@Autowired
SessionFactory sessionFactory;
Session session;
@PostConstruct
void init() {
this.session = sessionFactory.getCurrentSession();
}
Редактировать: Если ваша цель - просто разрешить исключение NullPointerException, как указано в комментариях, используйте вместо этого:
@PostConstruct
void init() {
this.session = sessionFactory.openSession();
}
Вот пример типичного использования SessionFactory в https://www.java2novice.com/hibernate/session-factory.
Я получаю ноль для сеанса.
Вы начинаете сеанс на SessionFactory где-нибудь еще? Смысл вызова .getCurrentSession() в том, чтобы вы не создавали кучу дополнительных сеансов по всей программе. Обычно это делается путем создания настраиваемой «фабрики сеансов», которая внедряет SessionFactory и при вызове какой-либо функции getSession () проверяет, был ли уже открыт сеанс. Если нет, он начинает новый сеанс и возвращает его.
Нет, я полагаю, что моя SessionFactory неверна. Вы можете проверить, я что-то упускаю?
@PeterPenzov Взгляните на мою редакцию этого ответа. Это помогает?
Подозреваю, что неправильно настраиваю запуск приложения. Не могли бы вы взглянуть сюда? stackoverflow.com/questions/51242707/…
Неа. Я уже ответил на ваш вопрос, и вы проголосовали против меня, поэтому я не заинтересован в решении других ваших проблем.
Это не мой голос против.
Должен ли я использовать @Transactional для активации @Autowired?
Релевантно: Что такое инъекция поля и как ее избежать?