• 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

VPS Starter Arubacloud
0 głosów
153 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 (269,120 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ź 215 wizyt
0 głosów
1 odpowiedź 563 wizyt
pytanie zadane 19 lipca 2020 w Java przez matiibal Użytkownik (620 p.)
0 głosów
1 odpowiedź 543 wizyt
pytanie zadane 17 marca 2020 w Java przez Placidus Użytkownik (580 p.)

92,452 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...