Почему @Entity не создает таблицу в бд
пишу не так давно на java. Создал проект https://github.com/Nubiroed/Game, вроде подключил mySql бд. Аннотация @Entity, должна создавать таблицу из сущности
(На другом проекте с spring, создается нормально, возможно дело в spring, но вроде созданием таблицы занимается не он.) Но, таблица не создается. Ошибок нет. Получить из бд сущность(или класс, пока не силен в терминологии) с помощью
у меня получилось, однако она тоже не обновляется автоматически(update вместо create я использовал, результат не меняется). Вопрос: почему не создается таблица? Заранее: я понимаю, что id в User должно быть Long, но chatGpt предложил такой пример(Long не работал так же). Также, скорее всего ошибка простейшая, но лично я не смог ее найти(я искал решение данного вопроса, в том числе на данном ресурсе). Ide intellij idea
Появились новые ошибки, скорее всего связаны(не нашел чего - то похожего на спойлер или скрывающего текст) `апр. 06, 2024 10:46:44 PM org.hibernate.Version logVersion INFO: HHH000412: Hibernate ORM core version 6.5.0.CR1 апр. 06, 2024 10:46:44 PM org.hibernate.cache.internal.RegionFactoryInitiator initiateService INFO: HHH000026: Second-level cache disabled апр. 06, 2024 10:46:44 PM org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator initiateService WARN: HHH000181: No appropriate connection provider encountered, assuming application will be supplying connections апр. 06, 2024 10:46:44 PM org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator getJdbcEnvironmentUsingJdbcMetadata WARN: HHH000342: Could not obtain connection to query metadata java.lang.UnsupportedOperationException: The application must supply JDBC connections at org.hibernate.engine.jdbc.connections.internal.UserSuppliedConnectionProviderImpl.getConnection(UserSuppliedConnectionProviderImpl.java:44) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:446) at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcIsolationDelegate.delegateWork(JdbcIsolationDelegate.java:61) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentUsingJdbcMetadata(JdbcEnvironmentInitiator.java:294) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:122) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:76) at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:130) at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:238) at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:215) at org.hibernate.boot.model.relational.Database.(Database.java:45) at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.getDatabase(InFlightMetadataCollectorImpl.java:221) at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.(InFlightMetadataCollectorImpl.java:189) at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:171) at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.build(MetadataBuildingProcess.java:129) at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:449) at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:101) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:966) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1016) at org.example.Main.main(Main.java:13)
Exception in thread "main" org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] due to: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided) at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:276) at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:238) at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:215) at org.hibernate.boot.model.relational.Database.(Database.java:45) at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.getDatabase(InFlightMetadataCollectorImpl.java:221) at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.(InFlightMetadataCollectorImpl.java:189) at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:171) at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.build(MetadataBuildingProcess.java:129) at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:449) at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:101) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:966) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1016) at org.example.Main.main(Main.java:13) Caused by: org.hibernate.HibernateException: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided) at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.determineDialect(DialectFactoryImpl.java:191) at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:87) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentWithDefaults(JdbcEnvironmentInitiator.java:156) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentUsingJdbcMetadata(JdbcEnvironmentInitiator.java:366) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:122) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:76) at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:130) at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) ... 12 more `.
Ответы (1 шт):
Вашему вопросу, кто-то поставил -1 и ушел, без объяснения причин. Это с моей точки зрения нехорошо, поэтому попробую объяснить, хотя бы некоторые причины, я (честно говоря, давно не пользовался непосредственно Hibernate, так как сейчас без Spring'a (в java разработке) почти никуда, а Spring имеет Hibernate "под капотом" и удобнее пользоваться data-jpa, поэтому если я скажу что-то ошибочно, простите меня старика). Итак:
- В файле hibernate.cfg.xml необходимо написать маппинги для всех используемых сущностей, т.е. для класса User, это будет:
<mapping class="model.User"></mapping>
- Насколько я помню, я тоже сталкивался с проблемой подключения к mySQL при работе с Hibernate, сейчас не помню почему, но просто указание localhost, порта и название БД не работало, но сработало вот так в файле hibernate.cfg.xml:
<property name="connection.url">jdbc:mysql://localhost:3306/<db_name_here>?useSSL=false&serverTimezone=Europe/Moscow&useUnicode=true&characterEncoding=utf8</property>
- В методе main Вам необходимо написать код для подключения и выполнения транзакций, попробуйте, например так:
StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
.configure("hibernate.cfg.xml").build();
Metadata metadata = new MetadataSources(registry).getMetadataBuilder().build();
SessionFactory sessionFactory = metadata.getSessionFactoryBuilder().build();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
- После запуска проекта, зайдите в БД и убедитесь, что таблица User создана. Лучше делать это в режиме дебага.
А вот этот участок кода, вставляет строку в уже созданную таблицу и закрывает транзакцию
User user = new User();
user.setId(1);
user.setEmail("23");
user.setMail("2552");
session.save(user);
session.getTransaction().commit();
sessionFactory.close();
Мне очень помогла книга: "Бауэр К., Кинг Г., Грегори Г. 'Java Persistence API и Hibernate'", настоятельно рекомендую ее прочитать.
Вот сейчас еще припомнил, что я использовал пятый Hibernate и он почему-то не дружил с коннектором mysql-connector-j , попробуйте в pom.xml попробовать (для 8 MySQL)
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>