• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed JPA nie tworzy automatycznie tabeli

Cloud VPS
0 głosów
309 wizyt
pytanie zadane 12 maja 2023 w Java przez Mikołaj Pątkowski Użytkownik (530 p.)
zamknięte 12 maja 2023 przez Mikołaj Pątkowski

Hej, chciałem dodać bazę danych do projektu Spring Boot. Problem jest w tym, że Spring Boot prawidłowo łączy się z bazą danych mysql online, ale nie wykonuje wobec niej utworzenia tablicy student. Baza danych postawiona jest na jakimś freesqldatabase.com, nie mam problemu żeby połączyć się z nią przez IntelliJ Ultimate (próbowałem też z embedded H2, też nie działało)

package com.db.mysql_db_test;

import lombok.Data;
import lombok.RequiredArgsConstructor;

import javax.persistence.*;

@Entity
@Data
@RequiredArgsConstructor
public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    @Column
    private String name;
}

MysqlDbTestApplication znajduje się w tym samym pakiecie

package com.db.mysql_db_test;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;

@EntityScan
@SpringBootApplication
public class MysqlDbTestApplication {
    public static void main(String[] args) {
        SpringApplication.run(MysqlDbTestApplication.class, args);
    }
}

application.properties (próbowałem już chyba wszystkich możliwych kombinacji)

spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://sql7.freesqldatabase.com:3306/sql7617804
spring.datasource.username=sql7617804
spring.datasource.password=Ta4mIZ6Be3

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>3.0.6</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.db</groupId>
	<artifactId>mysql_db_test</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>mysql_db_test</name>
	<description>mysql_db_test</description>
	<properties>
		<java.version>17</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>
		<dependency>
			<groupId>javax.persistence</groupId>
			<artifactId>javax.persistence-api</artifactId>
			<version>2.2</version>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
			<scope>runtime</scope>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>com.mysql</groupId>
			<artifactId>mysql-connector-j</artifactId>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<excludes>
						<exclude>
							<groupId>org.projectlombok</groupId>
							<artifactId>lombok</artifactId>
						</exclude>
					</excludes>
				</configuration>
			</plugin>
		</plugins>
	</build>

</project>

Nie wiem, w którym miejscu pojawia się ten problem. Utworzyłem świeży projekt, idę krok po kroku z poradnikiem na YT i wciąż nie działa.

Mógłbym oczywiście obejść ten problem, ręcznie tworząc tablicę (CREATE TABLE...), ale chcę tego uniknąć, bo po to chyba jest jpa żeby wszystko było uproszczone.

komentarz zamknięcia: Udało się rozwiązać problem. W moim przypadku należało zamienić javax.persistance.* na jakatra.persistance.* .  Już wcześniej miałem "problemy" z javax.validate, musiałem dodatkowo uwzględniać je w pom.xml. Po zmianie na jakarta wszystko działa, a obok nazwy klasy w IntelliJ pojawiła się ikonka bazy danych.

1 odpowiedź

+2 głosów
odpowiedź 12 maja 2023 przez Wiciorny Ekspert (281,390 p.)
edycja 12 maja 2023 przez Wiciorny

Używasz @EntityScan a w w jakiej paczce masz encje? Dlaczego np. korzystasz z tej adnotacji ? 


jeszce w konfiguracji sprawdź 

spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto = create

Jesli to nie pomoże, to dalej problem pozostaje do adnotacji, którą użyłeś, ale nie wiem z jakiego powodu i czy faktycznie rozumiesz, co robisz.
Ta adnotacja nie utworzy Ci beanów, a jedynie określa tylko, które klasy powinny być używane w określonym kontekście trwałości. 
Zamień to na 

@EnableAutoConfiguration

chyba, że masz własną konfiguracje to dodać musisz @ComponentScan i paczke z konfiguracją. 

Zazwyczaj tej adnotacji używasz kiedy masz Encje oderwane od kontekstu Springa, zewnętrzne jakieś, albo specjalnie chcesz określić paczkę w momencie budowy projektu. 
W tym momencie spring nic nie wie o twoich encjach. 

Jeszcze jedna sprawa mówisz o korzystaniu z JPA, ale nie uwzględniasz dla niego dialektu to też możę być problem, dodaj do pliku properties ( oczywiście pamiętaj, że ten plik musi być w resources), dodatkowo pamiętaj że skanowanie zaczyna się od głównego węzła programu czyli uruchomieniowej klasy w dół, czyli w wszystkie pod pakiety wraz z pakietem w którym jest klasa- starter. 
 

spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect



 

komentarz 12 maja 2023 przez Mikołaj Pątkowski Użytkownik (530 p.)

Korzystałem z @EntityScan, ponieważ większość rozwiązań tego problemu w internecie polega właśnie na dodaniu tej adnotacji (wiem, że wszystkie pliki były w jednym pakiecie, w zasadzie to po prostu zapomniałem usunąć tej linijki kodu). Zamiana na @EnableAutoConfiguration nic nie zmienia.

Po dodaniu dialektu zaczął pojawiać się error:

Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
[...]
Caused by: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
[...]
Caused by: org.hibernate.boot.registry.selector.spi.StrategySelectionException: Unable to resolve name [org.hibernate.dialect.MySQL5InnoDBDialect] as strategy [org.hibernate.dialect.Dialect]
[...]
Caused by: org.hibernate.boot.registry.classloading.spi.ClassLoadingException: Unable to load class [org.hibernate.dialect.MySQL5InnoDBDialect]
[...]
Caused by: java.lang.ClassNotFoundException: Could not load requested class : org.hibernate.dialect.MySQL5InnoDBDialect

Być może nie mam jakiejś zależności, albo coś innego?

Podobne pytania

0 głosów
1 odpowiedź 316 wizyt
0 głosów
1 odpowiedź 1,074 wizyt
pytanie zadane 19 lipca 2020 w Java przez matiibal Użytkownik (620 p.)
0 głosów
1 odpowiedź 857 wizyt
pytanie zadane 17 marca 2020 w Java przez Placidus Użytkownik (580 p.)

93,453 zapytań

142,448 odpowiedzi

322,717 komentarzy

62,831 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...