Spring data jpa bug笔记

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:写的很杂 有错误的地方劳烦提出下。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享