mysql与spring data jpa使用中的个人总结

基于spring boot

1、自动创建mysql数据表

当完成实体类的编写后,可以自动创建相关的数据表。

在配置文件中添加

# Hibernate ddl auto (create, create-drop, update)
# create 每次启动都会重新创建相关表
# create-drop 启动的时候创建,结束的时候销毁
# update 仅更新未创建的表
spring.jpa.hibernate.ddl-auto = create
# 指定数据表使用的引擎, 默认是MyISAM
spring.jpa.database-platform = org.hibernate.dialect.MySQL5InnoDBDialect

不要再生成环境使用

2、创建实体是添加创建时间,更新的时候更新时间

    private Date createTime;
    private Date updateTime;

    @PrePersist
    protected void onCreate() {
        createTime = new Date();
    }

    @PreUpdate
    protected void onUpdate() {
        updateTime = new Date();
    }

3、one to one

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "org_id")
    private Org org;

    @Column(name = "org_id", insertable = false, updatable = false)
    private Long orgId;
fetch 可以是 LAZY 或者 EAGER。LAZY表示懒加载,不会主动去加载。建议大多数情况使用LAZY,避免存在一些性能问题,如递归加载的问题。
只使用OneToOne,无法获取到关联对象的id,必须去加载,可以用过@Column(name = "org_id", insertable = false, updatable = false)的方式来获取对应的id;

OneToOne ManyToMany等使用懒加载的方式,在spring boot进行json序列话的时候会抛出com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer的异常。
可以在实体类上面加@JsonIgnoreProperties注解,来忽略相关属性的序列化。

4、懒加载异常
直接获取实体对象的LAZY注解的属性时,会抛出org.hibernate.LazyInitializationException: ..., could not initialize proxy - no Session
简单说就是查询的上下文已经关闭了,这时候再去查询就会抛异常了,解决方式有好几个,可以参考https://vladmihalcea.com/the-hibernate-enable_lazy_load_no_trans-anti-pattern/
  1、添加配置(这种方式不推荐使用)
  spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
  2、使用Transactional
...
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "org_id")
private Org org;
...
@ManyToMany(mappedBy = "managedOrgs", fetch = FetchType.LAZY)
private List<User> managers = new ArrayList<>();
...


@Transactional
    public List<User> getDirectSuperiors(User user) {
        User user = userRepository.findById(user.getId());
        Org org = new Org(optionalUser.get().getOrgId());
        return org.getManagers();
    }

  在事务中获取懒加载的属性不会抛异常。

  3、使用NativeQueries等sql的方式,实现复杂查询。

扫描二维码关注公众号,回复: 44886 查看本文章

未完。。。



猜你喜欢

转载自www.cnblogs.com/lilinwei340/p/8910772.html