2015-04-10 3 views
3

я испытываю проблемы с Hibernate метания следующие ошибки:Hibernate говорит, что таблица не существует, но она делает

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'Library.book' doesn't exist 

настройки Моя зависимость выглядит следующим образом (я считаю, что это может быть причиной):

compile("org.springframework.boot:spring-boot-starter-web") 
testCompile("org.springframework.boot:spring-boot-starter-test") 

compile 'org.springframework:spring-orm:4.1.6.RELEASE' 
compile 'org.springframework.data:spring-data-jpa:1.8.0.RELEASE' 

compile 'org.hibernate:hibernate-entitymanager:4.3.8.Final' 
compile 'org.hibernate:hibernate-core:4.3.8.Final' 

compile 'org.apache.commons:commons-dbcp2:2.1' 

compile 'mysql:mysql-connector-java:5.1.35' 

compile 'org.apache.logging.log4j:log4j-core:2.2' 

Итак, я использую Spring-boot-starter-web (проект, созданный с использованием Spring CLI), а затем добавил не-пружинные зависимости для Hibernate и Spring Data, среди прочего, (использовал ту же самую зависимость, установленную в разных проектах, но без Spring-Boot-Starter-Web, и все работало просто отлично).

После прочтения других вопросов я проверил, имеет ли мои @EnableJpaRepositories правильный путь к репозиториям, и если у entityManagerFactoryBean есть пакетыToScan правильно настроены.

Я считаю, что Spring Boot имеет конфликты с другими зависимостями, потому что моя конфигурация выглядит нормально.

Я теперь показывают некоторые фрагменты кода, потому что я мог бы быть неправым о правильности моей конфигурации в, р

Книга MySQL DDL:

CREATE TABLE IF NOT EXISTS `Library`.`Book` (
    `id` INT NOT NULL AUTO_INCREMENT, 
    `title` VARCHAR(100) NOT NULL, 
    `description` VARCHAR(256), 
    `genre` VARCHAR(50) NOT NULL, 
    `releaseDate` DATE NOT NULL, 
    PRIMARY KEY (`id`) 
) 

Книга лицо:

@Entity 
@Table(name="Book") 
public class Book { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int id; 
    private String title; 
    private String description; 
    private String genre; 
    @Temporal(TemporalType.DATE) 
    private Date releaseDate; 
} 

EntityManagerFactory боб :

@Bean 
@Autowired(required = true) 
public EntityManagerFactory entityManagerFactory(DataSource dataSource) { 
    HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); 
    vendorAdapter.setGenerateDdl(true); 
    vendorAdapter.setShowSql(false); 
    vendorAdapter.setDatabasePlatform("org.hibernate.dialect.MySQLDialect"); 
    vendorAdapter.setDatabase(Database.MYSQL); 

    LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean(); 
    factory.setJpaVendorAdapter(vendorAdapter); 
    factory.setPackagesToScan("pl.com.imralav.library.data.entity"); 
    factory.setDataSource(dataSource); 

    Properties properties = new Properties(); 
    properties.setProperty("hibernate.generate_statistics", "false"); 
    properties.setProperty("hibernate.show_sql", "false"); 

    factory.setJpaProperties(properties); 

    factory.afterPropertiesSet(); 

    return factory.getObject(); 
} 

Скажите, пожалуйста, если вам нужна дополнительная информация.

+0

Если вы внимательно посмотрите, что «Library.book» имеет «книгу» в нижнем регистре. Возможно, это связано с [JPA 2.0 и MySQL не соответствуют именам таблиц, чувствительных к регистру] (http://stackoverflow.com/questions/15247386/jpa-2-0-mysql-are-not-respecting-case-sensitive-table -names) –

+0

Существует некоторое улучшение после изменения имени базы данных в книге, появляется новая ошибка: 'com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Неизвестный столбец 'book0_.release_date' в полевом списке ', я попытался исправить его, используя @Column (name = "releaseDate") аннотацию, но это не сработало (как @Table (name = "Book") не было). Любая идея, почему аннотации игнорируются? – Tomek

+0

После воссоздания базы данных с изменением схемы книги (release_date вместо releaseDate) все работает отлично.Но я не удовлетворен, так как мне нужно знать, почему работали некоторые аннотации (например, '@ Entity', потому что книга была сопоставлена ​​с таблицей базы данных), а некоторые нет (например,' @ Table', '@ Column', они didn 't заставить Hibernate искать другое имя таблицы или другого столбца). – Tomek

ответ

2

Проблема заключалась в том, что я плохо понимал, как работает Spring Boot. Он загружает весь набор классов автоконфигурации, которые в моем случае устанавливают неверную стратегию именования для Hibernate. Все, что я должен был сделать исключение автоконфигурирования класс гибернации

@SpringBootApplication(exclude={HibernateJpaAutoConfiguration.class}) 

и вдруг все работали так же, как я хотел. Большое спасибо @Nicolas за то, что указали мне в правильном направлении с его комментариями.

Единственное, что меня удивляет, что согласно Спринг загрузки Артикул:

Auto-configuration is noninvasive, at any point you can start to define your own configuration to replace specific parts of the auto-configuration. For example, if you add your own DataSource bean, the default embedded database support will back away.

, но в моем случае это не сработало., и он отлично работает, мне просто нужно было «переопределить» правильный bean-компонент (как указал @Oliver)

+0

Отключение автоконфигурации работает, если вы придерживаетесь соглашений об экспонировании 'LocalContainerEntityManagerFactoryBean' вместо' EntityManagerFactory', поскольку это то, что в настоящее время ожидает автоматическая конфигурация Boot. Я зарегистрировал [билет для загрузки Spring] (https://github.com/spring-projects/spring-boot/issues/2803), чтобы также рассмотреть этот случай, но просто переключение на возвращение «LCEMFB» должно заставить его работать как и ожидалось. –

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