新人小白记录自己的采坑记录
springboot整合jpa步骤:
(一)添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
(二)配置文件添加配置
spring.jpa.hibernate.ddl-auto=update
spring.jpa.hibernate.ddl-auto:不同的参数对应不同的建表更表规则,开始的时候选择create-drop,导致每次重启项目,原来的数据就消失不见。
create:每次加载都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
create-drop:每次加载时根据model类生成表,但是sessionFactory一关闭,表就自动删除。
update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会。
validate:每次加载时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。
(三)创建bean
@Entity
@Table(name="user_test")
public class UserTest {
@Id
@GeneratedValue //自增
private Long id;
@Column(nullable = false) //是否可为空
private String name;
@Column(nullable = false)
private Integer age;
//省略get和set
(四)创建数据接口
public interface UserTestDao extends JpaRepository<UserTest,Long> {
UserTest findByName(String name);
List<UserTest> findByNameAndAge(String name, Integer age);
@Query("from UserTest u where u.name=:name")
UserTest findUser(@Param("name") String name);
}
(五)调用方法
UserTest userTests= userTestDao.findByName(userName);
System.out.println("获取到的用户信息是:"+userTests);
报错如下:result returns more than one elements
报错截图
(六)原因分析
报错信息提示结果返回多个元素,我们打开数据库查看数据表中的数据发现
jpa根据实体类自动生成表
表中用户名为aaaa的用户有两个,查询该用户的时候,返回的数据有多个,而我们打印的事一个userTest,系统不知道选择打印哪一个,所以导致报错,以此类推,如果查询表中唯一存在的数据,是不是正常显示?通过测试发现,查找如idea、ceshi、zhaohj等数据时,可以正常打印
(七)解决优化
将原来的
UserTest findByName(String name);
改成
List<UserTest> findByName(String name);
查找优化
if (userTests.size() != 0) {
if (userTests.size() > 1) {
System.out.println("获取到的用户信息是:" + userTests.get(1));
} else {
System.out.println("获取到的用户信息是:" + userTests);
}
} else {
Random random = new Random();
userTestDao.save(new UserTest(userName, random.nextInt(100)));
}
查找aaaa的时候,打印第一个数据