使用 Spring Boot + Hibernate + MySql 运行 MVC 应用程序
Posted
技术标签:
【中文标题】使用 Spring Boot + Hibernate + MySql 运行 MVC 应用程序【英文标题】:Running a MVC app using Spring Boot + Hibernate + MySql 【发布时间】:2014-08-22 07:00:11 【问题描述】:我是 Spring 环境的新手。我试图使用 SpringBoot 和 Hibernate 作为 ORM 和 mysql 作为数据库来开发一个基本的 MVC 应用程序。我在设置依赖项和配置时遇到了很多麻烦。目前,我对以下错误感到震惊,我无法弄清楚如何克服它。
org.springframework.beans.factory.BeanCreationException: Cannot determine embedded database driver class for database type NONE. If you want an embedded database please put a supported one on the classpath.
这是我在应用程序中的设置。它没有服务层和jsp页面以避免混乱
数据库:
MySql - 一个名为 Users 的数据库已经存在,它有一个名为 Users 的表,其中包含一个示例用户列表
User.java(模型)
@Entity
@Table(name = "Users")
public class User
@Id
@GeneratedValue
public String id;
public String username;
public String firstname;
public String lastname;
public String password;
用户存储库:
@Repository
@Table(name = "Users")
public interface UserRepository extends JpaRepository<User, String>
用户控制器:
@RestController
public class UserController
private UserRepository userRepository;
@Autowired
public UserController(UserRepository userRepository)
this.userRepository = userRepository;
@RequestMapping("user")
public void getUser(@RequestParam("id") String id)
User user = userRepository.findOne(id);
Application.properties:
server.port: 9000
spring.datasource.url:jdbc:mysql://localhost/Users
spring.datasource.driverClassName: com.mysql.jdbc.Driver
spring.datasource.username: 根
spring.datasource.password:
POM.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.1.3.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<exclusions>
<exclusion>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- HIBERNATE -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.3.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.3.0.Final</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.0-api</artifactId>
<optional>true</optional>
</dependency>
<!-- Spring ORM, works with Hibernate -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
</dependency>
<!-- MYSQL -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
编辑:添加主类
主类
@ComponentScan
@Configuration
@EnableAutoConfiguration
public class ApplicationStart
public static void main(String[] args)
SpringApplication.run(ApplicationStart.class, args);
这是我的应用程序的当前设置。我什至不知道在哪里寻找错误,互联网上的教程对我的事业没有帮助。因此,非常感谢有关如何解决异常的任何帮助。
如果需要更多信息,请发表评论。
谢谢-
【问题讨论】:
显然它不会读取您的application.properties
文件。确保它位于类路径的根目录 (src/main/resources
) 或位于 jar 旁边的文件系统上。通常,您可以使用 =
而不是 :
在属性文件中分隔键/值对,尽管后者应该可以工作。我也没有真正得到你的设置,只是删除了休眠的排除项,只包含 hibernate-entitymanager
而没有版本作为依赖项。其他一切都会得到照顾。
@M.Deinum:如果我删除该排除项,我会收到以下异常 - java.lang.IllegalArgumentException: Not an managed type: class models.User
而且,我的 application.properties 位于资源目录中。
这更多地表明您的设置存在其他问题。请添加您拥有的任何其他配置类/文件。
EnableAutoConfiguration
正在尝试根据它所在的包确定要扫描哪些包以查找实体。您可能需要添加一个 @EntityScan
指向包含您的实体类的包。另请注意,ComponentScan
将从 ApplicationStart
类所在的同一包开始扫描。也许您可以在帖子中包含您的包结构。
问题在于 ApplicationStart 与控制器、存储库和模型不在同一个包中。在将它们放在同一个包中之后,事情开始起作用了。我也不必添加 @EntityScan 注释。感谢您的帮助:)您能否在您的答案中添加您的最后一条评论 - 它可以帮助其他人轻松找到它:)
【参考方案1】:
确保您的application.properties
位于supported locations 之一中。
当前目录的 /config 子目录。 当前目录 类路径 /config 包 类路径根
列表按优先级排序(列表中较高的位置覆盖较低的项目)。
虽然使用:
分隔属性文件中的键/值对应该可行,但我建议坚持使用更常用的=
分隔符。
您的 pom 包含一些不必要的杂物,我建议您移动它们。您应该只需要对mysql-connector-java
的依赖,其他一切都很混乱(其他依赖项是通过您依赖的启动项目提供的)。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- MYSQL -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
这些应该是您需要的一切,版本和传递依赖项由 spring-boot-dependency pom.xml 处理。 (starter-parent 的祖父母)。
当使用@EnableAutoConfiguration
注解时,带有注解的类也将用于确定from which package开始扫描。通常,您会将此注释放在您的入门课程中。建议将此应用程序类放在***包中(即your.package.application.StarterClass
),所有其他包都应该是该包的子包。这样所有的类都会被自动检测到。
如果这不可能,您可能需要添加一个额外的@ComponentScan
来指定一个基本包开始扫描,并添加一个@EntityScan
来指定包含您的实体的包。
【讨论】:
1) 我的 application.properties 在资源目录下。 2)我应用了您提供的依赖项配置,但我似乎遇到了以下异常:java.lang.IllegalArgumentException: Not an managed type: class models.User
这基本上表明它已经比依赖关系更进一步(它显然通过了数据源配置)并尝试构建存储库。请将您的主要课程添加到原始帖子中。
@M.Denium:我也添加了主类。除了我发布的配置之外,我似乎没有在应用程序中设置任何其他配置。
是否需要对hibernate-entitymanager
的显式依赖?在spring-boot-starter-data-jpa:1.1.8.RELEASE
中,我看到了对hibernate-entitymanager
的依赖。
@Abdull 如果你使用 JPA 的 starter pom 那么你不需要 hibernate-entitymanager 的显式依赖【参考方案2】:
我也面临同样的问题,但原因非常不同,我在所有答案中都尝试了上面提到的每件事,需要 2 小时。但终于知道我的文件属性名称“Application.properties”以大写“A”开头。它应该是小“A”。因此,请同时考虑这一点。
【讨论】:
以上是关于使用 Spring Boot + Hibernate + MySql 运行 MVC 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
6.Spring+Struts+Hibernat注解方式整合