关于spring jpa的问题

我在使用 repository 获取对象的时候,有的时候获取的并不是实体对象,打了断点显示得到的是一个 HibernateProxy 对象,这就导致我将获取到的对象保存到数据库时报错,怎么才能拿到实体对象,而不是 HibernateProxy

这是因为你开了“延迟加载”,导致返回的对线是一个代理对象。
当你操作对象关联属性的时候它才会去数据库检索数据。你对象建模怎么写的。

这个因为公司管理严格,不能透露太多代码:

@Entity
public class zuzhi implements Serializable {
    ...
    @Checked(nullable = false, regexp = "(([0-9]{9})([Z|L|0-9]{1})([0-9]{2})([S0-9]{1})([0-9HX]{2,3}))")
    @Column(nullable = false, length = 16, name = "code", unique = true)
    private String code;
   ...
}

repo 当时就是 findbycode(),也就是根据上边这个字段查询

完整的情景是这样的:
两个表 A,B。B 表有个字段作为外键关联了 A 表的 code 字段。然后在 service 层我先根据传入的 code 获取 A 表中对应数据,然后把对象存入 B 表中关联的那个字段。

我猜现在就是因为从 A 表获取的对应数据是一个延迟加载对象,导致存入 B 表中的字段是延迟加载对象,所以 jpa 在管理关联的时候出了问题

我也一直用JPA,但是我不用OOP建模,这维护关系太繁琐了。
你这问题我一时也不知道咋整,你关联列添加了 lazy属性吗?把它设置为"false"试试看?

补充一下 B 表的关联字段吧:

@Entity
public class ContractApprove implements Serializable {
    ... 
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "orgcode", referencedColumnName = "code")
    private zuzhi orgcode;
}

我改过 fetch 方式为 eager,也不好用

我网上查了一下,你试试看这2个方法。

1, 在实体类上添加注解

@Proxy(lazy = false)

2,使用Hibernate的工具类获取到真实对象

Object unproxiedEntity = Hibernate.unproxy(proxy); // 自己再做强制类型转换

第一个成功了

1 个赞