基于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 查看本文章
未完。。。