Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Schema 'SA' does not exist and dropping table

Tags:

I am using Spring Boot to create a courses and Topics database. I am having trouble with a bunch of errors that showed up once I made changes to my Courses classes. I am not sure what's wrong. Here are the error messages:

 ERROR 1136 --- [           main] org.hibernate.tool.hbm2ddl.SchemaExport  : HHH000389: Unsuccessful: alter table course drop constraint FKokaxyfpv8p583w8yspapfb2ar      ERROR 1136 --- [           main] org.hibernate.tool.hbm2ddl.SchemaExport  : Schema 'SA' does not exist      ERROR 1136 --- [           main] org.hibernate.tool.hbm2ddl.SchemaExport  : HHH000389: Unsuccessful: drop table course      ERROR 1136 --- [           main] org.hibernate.tool.hbm2ddl.SchemaExport  : Schema 'SA' does not exist      ERROR 1136 --- [           main] org.hibernate.tool.hbm2ddl.SchemaExport  : HHH000389: Unsuccessful: drop table topic      ERROR 1136 --- [           main] org.hibernate.tool.hbm2ddl.SchemaExport  : Schema 'SA' does not exist      WARN 1136 --- [           main] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Warning Code: 10000, SQLState: 01J01      WARN 1136 --- [           main] o.h.engine.jdbc.spi.SqlExceptionHelper   : 

Database 'memory:testdb' not created, connection made to existing database instead.

Also, here is my Course code, the topics code is alright I think but I am having trouble with this. I am using an internal database.

package ...

@Entity  public class Course {     // here generate constructors and getters/setters     @Id     private String id;     private String Name;     private String description;      @ManyToOne     private Topic topic; //use it to tie this class to the Topic class, to make it easier for the user      public Topic getTopic() {         return topic;     }      public void setTopic(Topic topic) {         this.topic = topic;     }      public Course() {     }      public Course(String id, String name, String description, String topicId) {         super();         this.id = id;         Name = name;         this.description = description;         this.topic = new Topic(topicId,"","");     }      public String getId() {         return id;     }     public void setId(String id) {         this.id = id;     }     public String getName() {         return Name;     }     public void setName(String name) {         Name = name;     }     public String getDescription() {         return description;     }     public void setDescription(String description) {         this.description = description;     } } 

Also my Controller:

@RestController() //makes anything a rest controller, every time you build a class and add this on top of it public class CourseController {      @Autowired // it marks the courseService as something that needs dependency inj.     private CourseService courseService;// To create a service you need a private courseService variable      //GETALL     @RequestMapping("/topics/{id}/courses")     public List<Course> getAllcourses(@PathVariable String id){         return courseService.getAllCourses(id);  //getAllCourses for the topic ID     }     //GET     @RequestMapping("/topics/{topicId}/courses/{id}")       public Course getCourse(@PathVariable String id) {         return courseService.getCourse(id);     }      //POST     @RequestMapping(method = RequestMethod.POST, value = "/topics/{topicId}/courses")     public void addCourse(@RequestBody Course course, @PathVariable String topicId) {          course.setTopic(new Topic(topicId, "", ""));         courseService.addCourse(course);     }      //PUT     @RequestMapping(method = RequestMethod.PUT, value = "/topics/{topicId}/courses/{id}")     public void updateCourse(@RequestBody Course course,  @PathVariable String id,  @PathVariable String topicId) {          course.setTopic(new Topic(topicId, "", ""));         courseService.updateCourse(course);      }     //DELETE     @RequestMapping(method = RequestMethod.DELETE, value = "/topics/{topicId}/courses/{id}")     public void deletecourse(@PathVariable String id, @PathVariable String topicId) {         courseService.deleteCourse(id);      } } 

And finally my Service class:

package io.msela.springbootstarter.course;  import java.util.ArrayList; import java.util.List;  import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;  @Service public class CourseService {      @Autowired // it injects the courseRepository as it's initialized     private CourseRepository courseRepository;      public List<Course> getAllCourses(String topicId){ //getting all is not good!         List<Course> courses = new ArrayList<>() ;         courseRepository.findByTopicId(topicId).forEach(courses::add);         return courses;     }      public Course getCourse(String id) {         return courseRepository.findOne(id);     }      public void addCourse(Course course) {         courseRepository.save(course); //save a course to the database             }      public void updateCourse(Course course) {         courseRepository.save(course);         //save does both add and update         }       public void deleteCourse(String id) {         courseRepository.delete(id);     } } 

EDIT: Here's my pom.xml file as well

http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0

<groupId>io.msela</groupId> <artifactId>course-api-data</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging>  <name>course-api-data</name> <description>Course API with Spring Data</description>  <parent>     <groupId>org.springframework.boot</groupId>     <artifactId>spring-boot-starter-parent</artifactId>     <version>1.5.4.RELEASE</version>     <relativePath/> <!-- lookup parent from repository --> </parent>  <properties>     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>     <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>     <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.apache.derby</groupId>         <artifactId>derby</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> 

EDIT 2

The Actual error seems to be the following:

Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'courseController': Unsatisfied dependency expressed through field 'courseService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'courseService': Unsatisfied dependency expressed through field 'courseRepository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'courseRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Could not create query metamodel for method public abstract java.util.List io.msela.springbootstarter.course.CourseRepository.findByName(java.lang.String)!

like image 463
Asker Avatar asked Jul 26 '17 09:07

Asker


Video Answer


2 Answers

This error appears in Derby only. It is because your Properties default is set to:

spring.jpa.hibernate.ddl-auto=create-drop 

You have to set it to:

spring.jpa.hibernate.ddl-auto=update 

Any further information can be found here: https://github.com/spring-projects/spring-boot/issues/7706

like image 122
Dominic Weiser Avatar answered Oct 05 '22 01:10

Dominic Weiser


Add following properties for spring boot

**#JPA**       spring.jpa.generate-ddl=true       spring.jpa.hibernate.ddl-auto=update       spring.jpa.database=default       spring.jpa.show-sql=true **#DATASOURCE**      spring.datasource.continue-on-error=false      spring.datasource.generate-unique-name=false      spring.datasource.username=app 
like image 22
Saurabh Naik Avatar answered Oct 05 '22 03:10

Saurabh Naik