Hibernate не видит данные в базе
UPD - вопрос решил.
Сломал всю голову...
Ситуация следующая, если очень в кратце
- Добавляю машины в базу
- Запрашиваю пару машин из базы
- Все ок, хибернейт их видит
Останавливаю приложение
- Смотрю на те машины которые есть в базе
- пытаюсь их запросить
- Хибернейт их не видит
- Добавляю новую машину
- Хибернейт её видит, но не видит машины добавленные в предыдущий запуск приложения.
В чем может быть проблема? =\
Создание сессии:
private static SessionFactory createSessionFactory() {
Configuration configuration = new Configuration().addAnnotatedClass(DailyReport.class).addAnnotatedClass(Car.class).configure();
StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder();
builder.applySettings(configuration.getProperties());
ServiceRegistry serviceRegistry = builder.build();
return configuration.buildSessionFactory(serviceRegistry);
}
конфиг
<property name="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/db_example</property>
<property name="connection.username">root</property>
<property name="connection.password">*****</property>
<property name="show_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<mapping class="model.DailyReport"/>
<mapping class="model.Car"/>
Ответы (2 шт):
Попробуйте следующий вариант файла HibernateUtil, где написана вами SessionFactory:
public class HibernateUtil {
private static StandardServiceRegistry registry;
private static SessionFactory sessionFactory;
public static SessionFactory getSessionFactory() {
if (sessionFactory == null) {
try {
// Create registry. По умолчанию берет данные из hibernate.cfg.xml
registry = new StandardServiceRegistryBuilder().configure().build();
// Create MetadataSources
MetadataSources sources = new MetadataSources(registry);
// Create Metadata
Metadata metadata = sources.getMetadataBuilder().build();
// Create SessionFactory
sessionFactory = metadata.getSessionFactoryBuilder().build();
} catch (Exception e) {
e.printStackTrace();
if (registry != null) {
StandardServiceRegistryBuilder.destroy(registry);
}
}
}
return sessionFactory;
}
// Не обязательно
public static void shutdown() {
if (registry != null) {
StandardServiceRegistryBuilder.destroy(registry);
}
}
}
Проблема была в следующем, у меня был метод покупки машины
public Car buyCar(String brand, String model, String licensePlate) {
Car car = null;
try {
transaction = session.beginTransaction();
Query query = session.createQuery("from Car where brand = :brand" +
" and model = :model and licensePlate = :licensePlate");
query.setParameter("brand", brand);
query.setParameter("model", model);
query.setParameter("licensePlate", licensePlate);
car = (Car) query.getSingleResult();
transaction.commit();
} catch (HibernateException e) {
transaction.rollback();
e.printStackTrace();
} finally {
if (session != null) {
try {
session.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
return car;
}
и все было хорошо, до тех пор пока не совершалась перезагрузка приложения в целом. И старые данные становились не видны. Проблему конкретно в моей случае решило добавление одного метода .setMaxResults(1)
В строку
car = (Car) query.setMaxResults(1).getSingleResult();
Пока я до конца не понял почему это так сработало. И почему хибер переставал видеть старые записи в базе. Хотя они там присутствовали. Если у кого-то есть идеи почему так происходило - велкам...