Spring data jpa bug笔记

461 阅读2分钟

Spring data jpa bug笔记

  1. org.hibernate.LazyInitializationException: 懒加载,网上百度大概的意思就是进行一对多查询的时候, session在执行完前者实体类的查询后就关闭了, jpa默认对于一对多实体的加载方式是懒加载 即@OneToMany 见代码
@OneToMany(mappedBy = "pointsAccount",cascade = CascadeType.ALL,fetch = FetchType.LAZY)

解决方式: 1. 一方中的多方 @OneToMany(mappedBy = "carFirm",cascade = CascadeType.ALL,fetch = FetchType.EAGER) private Set brandTypeSet;//汽车厂商与汽车品牌为一对多的关系 2. 多方中的一方 @ManyToOne(cascade = CascadeType.ALL,optional = false,fetch = FetchType.LAZY) @JoinColumn(name="brandid",referencedColumnName = "carfirm_id") private CarFirm carFirm; //汽车厂商与汽车品牌为一对多的关系 3:spring yml文件配置

此处解决方式附上原文连接 www.cnblogs.com/muhy/p/1180… (感谢作者但是并没有完全解决我的问题hh)


jpa:
    show-sql: true
    properties:
      hibernate:
        enable_lazy_load_no_trans: true
        
        format_sql: true

就是将一对多中的多方的加载方式改为立刻加载,而一对多中的一方改为懒加载即可.

  1. Unable to find column with logical name: POINTS_ACCOUNT_ID in org.hibernate.mapping.Table(points_account) 出现原因是我在设置 pointsAccount和 depositPoints 表的时候 设置了 外键 需要用 @Column 表明成员变量在数据库中字段的名称 例如修改前 缺少@Column字段 jpa无法匹配对应的外键关系
        @Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
//	@Column(name = "POINTS_ACCOUNT_ID")
	private Integer pointsAccountId;

修改后

        @Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "POINTS_ACCOUNT_ID")
	private Integer pointsAccountId;

3.Jpa jql 规范 当需要进行update操作的时候,Jpa提供了两种方式 save方法 和jql规范

save(S entity) 直接传入修改对象 其中的规则是
当id不存在的时候 新增对象 id存在的时候,修改其余字段

jql规范 语法与sql差不多,配合两个注解 @Modifying, @Query来使用,下面是一个实例,两点需要注意

  • 表名是我们定义的与db中表关联的POJO
  • 参数传递格式为?index, index为参数位置 例子
	@Query("update PointsAccount p set p.pointsTotal = ?1 where p.pointsAccountId = ?2")
	void updatePointsTotal(Integer pointsTotal,Integer pointsAccountId);

!!!!注意事项 这里的表名 PointsAccount对应实体类的名字, p.pointsTotal 对应实体类中的成员变量名称!! 并非是数据库字段名
如果表名这一块填写的是 数据库表明 那就会出现异常 例如

错误示范 (假如数据库表名是 points_account)
@Modifying
	@Query("update points_account p set p.pointsTotal = ?1 where p.pointsAccountId = ?2")
	void updatePointsTotal(Integer pointsTotal,Integer pointsAccountId);

QuerySyntaxException: points_account is not mapped 这个名称无法映射到对应的sql语句中

ps:写的很杂 有错误的地方劳烦提出下。