6

我对 Spring JPA、Hibernate、MySQL 有疑问。我有一个实体(Nom.java)和存储库(公共接口 NomRepository 扩展了 JpaRepository)。它们的创建和注入都很好。

问题是,当我尝试通过存储库的保存方法保存记录时,spring 抱怨“表”不存在”。事实上,我在 MySQL 中没有看到这个表。你已经尝试过 hibernate.hbm2ddl.auto 的不同值,但它没有帮助。

我使用无 XML 配置顺便说一句。

这是配置文件:

package ru.interosite.awp.config;

import java.util.Properties;
import javax.sql.DataSource;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.jpa.JpaVendorAdapter;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.Database;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;

@Configuration
@ComponentScan("ru.interosite.awp")
@EnableAutoConfiguration
public class AppConfiguration {

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/awp");
        dataSource.setUsername("root");
        dataSource.setPassword("password");
        return dataSource;
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource, JpaVendorAdapter jpaVendorAdapter) {
        LocalContainerEntityManagerFactoryBean lef = new LocalContainerEntityManagerFactoryBean();
        lef.setPersistenceUnitName("my_pu");
        lef.setPackagesToScan("ru.interosite.awp.data");
        lef.setDataSource(dataSource);
        lef.setJpaVendorAdapter(jpaVendorAdapter);
        lef.setJpaProperties(getJpaProperties());
        return lef;
    }

    @Bean
    public JpaVendorAdapter jpaVendorAdapter() {
        HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter();

        jpaVendorAdapter.setDatabase(Database.MYSQL);
        jpaVendorAdapter.setGenerateDdl(true);
        jpaVendorAdapter.setShowSql(true);
        jpaVendorAdapter.setDatabasePlatform("org.hibernate.dialect.MySQL5Dialect");

        return jpaVendorAdapter;
    }

    private Properties getJpaProperties() {
        return new Properties() {
            {
                setProperty("hibernate.hbm2ddl.auto", "update");
                setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
                setProperty("hibernate.show_sql", "true");
                setProperty("hibernate.format_sql", "true");
            }
        };
    }
}

这是我启动应用程序的方式:

package ru.interosite.awp;

import java.awt.Font;
import javax.swing.UIManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.context.ApplicationContext;
import ru.interosite.awp.config.AppConfiguration;
import ru.interosite.awp.gui.UIUtils;

public class Boot {

    private static final Logger LOGGER = LoggerFactory.getLogger(Boot.class);

    public static void main( String[] args )
    {

        UIUtils.setUIFont(new javax.swing.plaf.FontUIResource(Font.SANS_SERIF, Font.PLAIN, 16));

        try {
            String lafClassName = UIManager.getSystemLookAndFeelClassName();
            UIManager.setLookAndFeel(lafClassName);
        } catch (Exception e) {
            LOGGER.debug(e.getMessage());
        }        

        ApplicationContext ctx = SpringApplication.run(AppConfiguration.class, args);
        ((Runner)ctx.getBean("runner")).start();
    }    
}

这是我的 pom.xml:

    <?xml 版本="1.0" 编码="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <modelVersion>4.0.0</modelVersion>

        <groupId>ru.interosite</groupId>
        <artifactId>AWP</artifactId>
        <version>1.0-SNAPSHOT</version>
        <包装>罐子</包装>

        <name>AWP</name>
        <url>http://maven.apache.org</url>

        <属性>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <start-class>ru.interosite.awp.Runner</start-class>
        </属性>

        <父>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <版本>0.5.0.M4</版本>
        </父>

        <依赖项>
            <依赖>
                <groupId>org.springframework</groupId>
                <artifactId>spring-orm</artifactId>
            </依赖>
            <依赖>
                <groupId>org.springframework.data</groupId>
                <artifactId>spring-data-jpa</artifactId>
            </依赖>
            <依赖>
                <groupId>org.springframework</groupId>
                <artifactId>spring-tx</artifactId>
            </依赖>                    
            <依赖>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
            </依赖>        
            <依赖>
                <groupId>org.hibernate</groupId>
                <artifactId>休眠实体管理器</artifactId>
            </依赖>
            <依赖>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <版本>5.1.26</版本>
            </依赖>

            <依赖>
                <groupId>org.mockito</groupId>
                <artifactId>mockito-all</artifactId>
                <版本>1.9.5</版本>
            </依赖>                                        
        </依赖>

        <构建>
            <插件>
                <插件>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <版本>2.3.2</版本>
                </插件>
                <插件>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </插件>
            </插件>
        </build>

        <存储库>
            <存储库>
                <id>弹簧快照</id>
                <name>春季快照</name>
                <url>http://repo.spring.io/libs-snapshot</url>
                <快照>
                    <启用>真</启用>
                </快照>
            </repository>
            <存储库>
                <id>春天的里程碑</id>
                <name>春季里程碑</name>
                <url>http://repo.spring.io/libs-milestone</url>
                <快照>
                    <启用>假</启用>
                </快照>
            </repository>
            <存储库>
                <id>org.jboss.repository.releases</id>
                <name>JBoss Maven 发布存储库</name>
                <url>https://repository.jboss.org/nexus/content/repositories/releases</url>
                <快照>
                    <启用>假</启用>
                </快照>
            </repository>
        </存储库>

        <pluginRepositories>
            <插件库>
                <id>弹簧快照</id>
                <name>春季快照</name>
                <url>http://repo.spring.io/libs-snapshot</url>
                <快照>
                    <启用>真</启用>
                </快照>
            </pluginRepository>
            <插件库>
                <id>春天的里程碑</id>
                <name>春季里程碑</name>
                <url>http://repo.spring.io/libs-milestone</url>
                <快照>
                    <启用>假</启用>
                </快照>
            </pluginRepository>
        </pluginRepositories>        

    </项目>

4

6 回答 6

14

您需要更改两个方法并删除 getProperties() 方法:

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(
        DataSource dataSource, JpaVendorAdapter jpaVendorAdapter) {
    LocalContainerEntityManagerFactoryBean lef = new LocalContainerEntityManagerFactoryBean();
    lef.setDataSource(dataSource);
    lef.setJpaVendorAdapter(jpaVendorAdapter);
    lef.setPackagesToScan("com.spring.domain");
    return lef;
}

@Bean
public JpaVendorAdapter jpaVendorAdapter() {
    HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new HibernateJpaVendorAdapter();
    hibernateJpaVendorAdapter.setShowSql(true);
    hibernateJpaVendorAdapter.setGenerateDdl(true); //Auto creating scheme when true
    hibernateJpaVendorAdapter.setDatabase(Database.H2);//Database type
    return hibernateJpaVendorAdapter;
}

重点是:</p>

hibernateJpaVendorAdapter.setGenerateDdl(true); 
于 2014-05-27T01:21:24.657 回答
5

在最新版本 [spring boot] 中。在 application.properties 中包含以下内容

spring.jpa.generate-ddl=true
于 2017-01-24T13:24:15.373 回答
2

好的,我终于找到了解决方法。1)首先,我将 AppConfiguration 类移动到顶级包,在我的案例中为 ru.interosite.awp 2)其次,我将注释更改为:

@Configuration
@ComponentScan
@EnableJpaRepositories
public class AppConfiguration {...

似乎 @EnableAutoConfiguration 注释搞砸了。我不知道这是错误还是功能。实际上看起来像是 spring-boot 的错误。

于 2013-10-03T07:10:24.520 回答
2

我换成了 M5 spring-boot-starter-xxx jars,现在我看到我的表被创建了

这是我的应用程序类(这是我第一次尝试春季启动,所以......)

import static org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType.H2;

import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.JpaVendorAdapter;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.Database;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    public DataSource dataSource() {
        return new EmbeddedDatabaseBuilder().setType(H2).build();
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(
            DataSource dataSource, JpaVendorAdapter jpaVendorAdapter) {
        LocalContainerEntityManagerFactoryBean lef = new LocalContainerEntityManagerFactoryBean();
        lef.setDataSource(dataSource);
        lef.setJpaVendorAdapter(jpaVendorAdapter);
        lef.setPackagesToScan("org.home.wtw.domain");
        return lef;
    }

    @Bean
    public JpaVendorAdapter jpaVendorAdapter() {
        HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new HibernateJpaVendorAdapter();
        hibernateJpaVendorAdapter.setShowSql(true);
        hibernateJpaVendorAdapter.setGenerateDdl(true);
        hibernateJpaVendorAdapter.setDatabase(Database.H2);
        return hibernateJpaVendorAdapter;
    }

    @Bean
    public PlatformTransactionManager transactionManager(
            EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }
}
于 2013-10-15T04:32:04.397 回答
1

如果要创建表,则必须将hibernate.hbm2ddl.auto属性设置为create。以下是 的可能值hibernate.hbm2ddl.auto

  • validate:验证模式,不更改数据库。
  • 更新:更新架构。
  • create:创建模式,销毁以前的数据。
  • create-drop:在会话结束时删除模式。

另外,请检查您的数据库 url 是否正确。

[更新]别忘了为spring定义一个事务管理器。

 @Bean
  public PersistenceAnnotationBeanPostProcessor persistenceAnnotationBeanPostProcessor()
  {
    PersistenceAnnotationBeanPostProcessor persistenceAnnotationBeanPostProcessor = new PersistenceAnnotationBeanPostProcessor();
    return persistenceAnnotationBeanPostProcessor;
  }
于 2013-10-02T15:28:19.293 回答
0

尝试spring.jpa.hibernate.ddl-auto=create在 application.properties 文件中给出。

于 2019-01-27T18:01:17.867 回答