@ResponseStatus(value=)
Hibernate
OneToOne:
使用optional=false,才能使用lazy
如果关联字段是当前表的主键,我试了不加optional=false,lazy也生效,如果不使用lazy, 默认会使用left out join 来查询
@Column(nullable=false)
is an instruction for generating the schema. The database column generated off the class will be marked not nullable in the actual database.
optional=false
is a runtime instruction. The primary functional thing it does is related to Lazy Loading. You can't lazy load a non-collection mapped entity unless you remember to set optional=false (because Hibernate doesn't know if there should be a proxy there or a null, unless you tell it nulls are impossible, so it can generate a proxy.)
Session:
长session应用性能影响并不大,如果不进行数据库操作,session不会获取jdbc连接, hibernate建议每个请求对应一次session
使用vo封装视图层需要的数据与openSessionInView各有优势,可以视情况使用,使用vo时,可以用Hibernate.initialize()或者用fetch查询出关联数据填充vo
使用ThreadLocalSessionContext策略,Hibernate的Session会随着getCurrentSession()方法自动打开,并随着事务提交自动关闭。
Session的打开关闭并意味着JDBC连接的打开关闭,创建Session时,并不会打开与数据库的连接,只有需要进行数据库操作时,才会获取JDBC连接
一级缓存是session级别,二级缓存将缓存所有访问过的实体,查询缓存缓存特定的数据
FetchMode:
不设置,默认为FetchMode.SELECT, 可以使用Lazy,会有n+1问题
FetchMode.JOIN - 采用外联,用一条sql取出关联数据,lazy无效
FetchMode.SUBSELECT- 生成两条sql, 第二条用in去查询关联数据
fetch_size - 设置批量查询的条数,和SUBSELECT类似,用in查询关联数据,生成多少sql取决于关联的数据量,默认是10,一般设置为50-100为佳
batch_size - 批量删除、更新、插入的量,一般设置为50-100为佳
max_fetch_depth - 外连接抓取深度,设置为0-3为佳
测试感觉OneToMany应用FetchMode.JOIN无效,需要进一步验证