2015-03-07 3 views
2

Установки: У меня есть приложение с пружинным загрузочным пакетом с простым объектом клиента @Entity и CustomerRepository. Я хочу предварительно загрузить базу данных с тестовыми данными, описанными here in my other question, поэтому я создал файлы schema.sql и data.sql для загрузки базы данных.CrudRepository не считывает данные из schema.sql

Проблема: Возможно, CrudRepository использует другую базу данных, чем та, которая создана с помощью schema.sql и data.sql. Я не определил источник данных нигде, потому что я надеюсь, что весна-загрузочная версия может по умолчанию для меня все (т. Е. Не определить spring.datasource в application.properties), и даже если я это сделаю, это ничего не делает.

@Autowired 
CustomerRepository r; 
r.findAll(); // nothing but it should return the row "John Doe" 

У меня нет ошибок, он просто ничего не возвращает, когда я вызываю findAll() в репозитории.

schema.sql

drop table customer if exists; 

create table customer (
    id bigint auto_increment, 
    firstname varchar(80) null, 
    lastname varchar(80) null 
); 

data.sql

insert into customer (firstname, lastname) values ('John', 'Doe'); 

Customer.java

package sample.jsp; 

import java.io.Serializable; 

import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.Table; 

@Entity 
public class Customer implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private long id; 

    private String firstName; 
    private String lastName; 

    protected Customer() {} 

    public Customer(String firstName, String lastName) { 
     this.firstName = firstName; 
     this.lastName = lastName; 
    } 

    public long getId() { 
     return id; 
    } 

    public void setId(long id) { 
     this.id = id; 
    } 

    public String getFirstName() { 
     return firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    public String getLastName() { 
     return lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    @Override 
    public String toString() { 
     return String.format(
       "Customer[id=%d, firstName='%s', lastName='%s']", 
       id, firstName, lastName); 
    } 

} 

CustomerRepository.java

package sample.jsp; 

import java.util.List; 

import org.springframework.data.repository.CrudRepository; 

public interface CustomerRepository extends CrudRepository<Customer, Long> { 

    List<Customer> findByLastName(String lastName); 
    List<Customer> findAll(); 
} 

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>1.1.8.RELEASE</version> 
    </parent> 
    <artifactId>TestApp</artifactId> 
    <packaging>war</packaging> 
    <name>Spring Boot Web JSP Sample</name> 
    <description>Spring Boot Web JSP Sample</description> 
    <url>http://projects.spring.io/spring-boot/</url> 
    <organization> 
     <name>Pivotal Software, Inc.</name> 
     <url>http://www.spring.io</url> 
    </organization> 
    <properties> 
     <main.basedir>${basedir}/../..</main.basedir> 
     <m2eclipse.wtp.contextRoot>/</m2eclipse.wtp.contextRoot> 
    </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-tomcat</artifactId> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.tomcat.embed</groupId> 
      <artifactId>tomcat-embed-jasper</artifactId> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>jstl</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-data-jpa</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>com.h2database</groupId> 
      <artifactId>h2</artifactId> 
     </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> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-surefire-plugin</artifactId> 
       <configuration> 
        <useSystemClassLoader>false</useSystemClassLoader> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 
</project> 
+0

и кто знает об этих файлах данных «sql»? какой процесс должен выполнять их? Весна? Инициализация emf JPA2.1? –

ответ

1

У меня была такая же проблема, и управлять ими, чтобы исправить это.

проблема не в расположении файлов SQL (в журнале отображается выполнение скриптов).

It was the default behavior of DDL generation of Springboot with In-memory DB like H2 и тот факт, что файлы SQL выполняются до генерации DDL (по умолчанию «создание-падение» для БД в памяти).

добавить эту строку в application.properties:

spring.jpa.hibernate.ddl-auto=validate 

и вы будете хорошо.

+0

Я столкнулся с подобной проблемой. Для целей тестирования я вставляю данные в память db из своего тестового примера. При запросе db с использованием репозиториев findAll метод из моего метода тестового случая извлекает вставленные данные, но когда мои тесты интеграции выполняются, а мой уровень сервиса пытается извлечь данные с помощью repository.findAll, он возвращает пустой набор. Любая идея об этом странном поведении? – user2912611

0

Эта часть Spring загрузочной документации описывает, как эта работа:

http://docs.spring.io/spring-boot/docs/1.2.2.RELEASE/reference/htmlsingle/#howto-intialize-a-database-using-spring-jdbc

В частности, вы должны убедиться, что оба SQL файлов находятся в корневом каталоге путь к классам. В качестве альтернативы вы можете указать (даже просто посмотреть, работает ли это так) точное местоположение/имя файла в вашем application.properties.

spring.datasource.schema=file:scripts/my-schema.sql 
2

Изменить имя data.sql к import.sql.

Spring Boot Database Initialization

+0

Я создал тестовую загрузочную бутсу + kotlin с памятью в базе данных H2 и хотел заполнить ее тестовыми данными. Я столкнулся с аналогичной проблемой - мой файл schema.sql запустился, но data.sql этого не сделал. Переименование его из data в import.sql решило мою проблему. Благодаря! – Croo

0

У меня была аналогичная проблема и я решил ее решить.

Чтобы заставить его работать, я должен был поставить эту аннотацию для каждого метода тестирования мне нужен тестовые данные:

@Sql("classpath:data.sql") 

Я использую пружинный загрузочный стартер-данные-JPA с Н2. В моем случае я запускаю тест, который зависит от некоторых исходных данных (созданных в data.sql).

Когда я запустил тест, схема была создана правильно, но, как и в вашем случае, CrudRepository, похоже, использует разные данные).

примечание: Я понимаю, что может быть поздно ответить на этот вопрос, но я надеюсь, что это поможет кому-то, у кого такая же проблема.

Смежные вопросы