Reputation: 419
Spring doesn't create the table specified in my @Entity
class in my Postgres database.
I've tried a lot of solutions given here in StackOverflow, like some changes in the application.properties
, changing the dialect, setting up the schema etc. I've checked my database permissions and also the user/password information, and it's all fine.
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
spring.datasource.url= jdbc:postgresql://localhost:5432/produtosapirest
spring.datasource.username=postgres
spring.datasource.password=postgres
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=update
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 http://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>2.1.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.produtos</groupId>
<artifactId>apirest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>apirest</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</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>
</plugin>
</plugins>
</build>
Produto.java
package produtos.api.models;
import java.io.Serializable;
import java.math.BigDecimal;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="TB_PRODUTO")
public class Produto implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private long id;
private String nome;
private BigDecimal quantidade;
private BigDecimal valor;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public BigDecimal getQuantidade() {
return quantidade;
}
public void setQuantidade(BigDecimal quantidade) {
this.quantidade = quantidade;
}
public BigDecimal getValor() {
return valor;
}
public void setValor(BigDecimal valor) {
this.valor = valor;
}
}
terminal: :: Spring Boot :: (v2.1.4.RELEASE)
2019-04-11 10:21:00.011 INFO 16132 --- [ restartedMain] com.produtos.apirest.ApirestApplication : Starting ApirestApplication on venancio-MS-7817 with PID 16132 (/home/brenorios/eclipse-workspace/apirest/target/classes started by brenorios in /home/brenorios/eclipse-workspace/apirest)
2019-04-11 10:21:00.014 INFO 16132 --- [ restartedMain] com.produtos.apirest.ApirestApplication : No active profile set, falling back to default profiles: default
2019-04-11 10:21:00.077 INFO 16132 --- [ restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable
2019-04-11 10:21:00.077 INFO 16132 --- [ restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG'
2019-04-11 10:21:00.880 INFO 16132 --- [ restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data repositories in DEFAULT mode.
2019-04-11 10:21:00.901 INFO 16132 --- [ restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 14ms. Found 0 repository interfaces.
2019-04-11 10:21:01.283 INFO 16132 --- [ restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$$EnhancerBySpringCGLIB$$84f3c51d] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2019-04-11 10:21:01.672 INFO 16132 --- [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2019-04-11 10:21:01.698 INFO 16132 --- [ restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2019-04-11 10:21:01.698 INFO 16132 --- [ restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.17]
2019-04-11 10:21:01.778 INFO 16132 --- [ restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2019-04-11 10:21:01.778 INFO 16132 --- [ restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1701 ms
2019-04-11 10:21:01.988 INFO 16132 --- [ restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2019-04-11 10:21:02.137 INFO 16132 --- [ restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2019-04-11 10:21:02.178 INFO 16132 --- [ restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [
name: default
...]
2019-04-11 10:21:02.226 INFO 16132 --- [ restartedMain] org.hibernate.Version : HHH000412: Hibernate Core {5.3.9.Final}
2019-04-11 10:21:02.227 INFO 16132 --- [ restartedMain] org.hibernate.cfg.Environment : HHH000206: hibernate.properties not found
2019-04-11 10:21:02.343 INFO 16132 --- [ restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.0.4.Final}
2019-04-11 10:21:02.455 INFO 16132 --- [ restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.PostgreSQL95Dialect
2019-04-11 10:21:02.659 INFO 16132 --- [ restartedMain] o.h.e.j.e.i.LobCreatorBuilderImpl : HHH000421: Disabling contextual LOB creation as hibernate.jdbc.lob.non_contextual_creation is true
2019-04-11 10:21:02.663 INFO 16132 --- [ restartedMain] org.hibernate.type.BasicTypeRegistry : HHH000270: Type registration [java.util.UUID] overrides previous : org.hibernate.type.UUIDBinaryType@3046a8a9
2019-04-11 10:21:02.834 INFO 16132 --- [ restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2019-04-11 10:21:02.852 INFO 16132 --- [ restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729
2019-04-11 10:21:03.042 INFO 16132 --- [ restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
2019-04-11 10:21:03.087 WARN 16132 --- [ restartedMain] aWebConfiguration$JpaWebMvcConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
2019-04-11 10:21:03.347 INFO 16132 --- [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2019-04-11 10:21:03.349 INFO 16132 --- [ restartedMain] com.produtos.apirest.ApirestApplication : Started ApirestApplication in 3.783 seconds (JVM running for 4.149)
ApirestApplication.java:
package com.produtos.apirest;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ApirestApplication {
public static void main(String[] args) {
SpringApplication.run(ApirestApplication.class, args);
}
}
Based on the tutorial that I'm following, this setup should result in the creation of the table in the postgres database, but it doesn't happen.
Upvotes: 1
Views: 8856
Reputation: 419
I just figured that it was a silly mistake. My main package and the model package weren't with the same name structure, so Spring wasn't getting my models package.
Before: com.produtosapirest2 com.produtosapi.models
After: com.produtosapirest2 com.produtosapirest2.models
Upvotes: 3
Reputation: 382
Your problem probably lies here,
spring.jpa.hibernate.ddl-auto=update
If you read more about this Here, you can identify that,
The
update
operation for example will attempt to add new columns, constraints, etc but will never remove a column or constraint that may have existed previously but no longer does as part of the object model from a prior run.
So I would suggest based on your requirements either you use create
or create-drop
.
Note:
create
and create-drop
will create DB each time you run the application. So if you don't want that to happen, once you create your DB, change the setting to update
.Upvotes: 2
Reputation: 3250
You are missing the Postgres Dialect. You can try adding the Postgres Dialect inside your properties/yml file as per below:
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
Upvotes: 1
Reputation: 10565
I just tried your source code and here are the logs:
2019-04-11 19:58:59.345 INFO 15520 --- [ restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.PostgreSQL95Dialect
2019-04-11 20:02:42.971 INFO 15520 --- [ restartedMain] o.h.e.j.e.i.LobCreatorBuilderImpl : HHH000421: Disabling contextual LOB creation as hibernate.jdbc.lob.non_contextual_creation is true
2019-04-11 20:02:42.975 INFO 15520 --- [ restartedMain] org.hibernate.type.BasicTypeRegistry : HHH000270: Type registration [java.util.UUID] overrides previous : org.hibernate.type.UUIDBinaryType@7893aaa9
2019-04-11 20:02:44.848 WARN 15520 --- [ restartedMain] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Warning Code: 0, SQLState: 00000
2019-04-11 20:02:44.848 WARN 15520 --- [ restartedMain] o.h.engine.jdbc.spi.SqlExceptionHelper : CREATE TABLE / PRIMARY KEY will create implicit index "tb_produto_pkey" for table "tb_produto"
2019-04-11 20:02:44.850 INFO 15520 --- [ restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2019-04-11 20:02:44.863 INFO 15520 --- [ restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729
2019-04-11 20:02:45.067 INFO 15520 --- [ restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
2019-04-11 20:02:45.111 WARN 15520 --- [ restartedMain] aWebConfiguration$JpaWebMvcConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
You can see that the table got created at the instance 20:02:44.848. This is after 2 minutes of the previous log. Check for @EnableAutoConfiguration
is set. I have it enabled as part of @SpringBootApplication
.
Wait till you see the statement printed - "Done---" by altering your Application.java:
package produtos.api;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Bean
public CommandLineRunner demo() {
return (args) -> {
System.out.println("Done---");
};
}
}
Upvotes: 1