gpt4 book ai didi

spring - hibernate JavassistLazyInitializer : problems with validation

转载 作者:行者123 更新时间:2023-12-03 21:38:45 25 4
gpt4 key购买 nike

我正在使用 Spring 开发我的应用程序,使用 Hibernate 和 JPA 作为 MySQL 数据库中的持久性 API。当我从数据库中获取我的大部分对象时,它们的属性会使用数据库的值进行初始化,并且集合是延迟加载的。问题来自一个名为 Business 的实体。加载为 JavassistLaziInitializer使用方法find()来自 EntityManager .

如果我执行 get 或 set 方法,他们会使用代理并给我所需的值,但是当我使用 @Valid 时和验证注释,因为实际值为 NULL(列值,而不是集合),我有验证错误,如 @NotNull .

我希望有人知道一种方法来获取用 JavassistLazyInitializer 代理值填充的列,或者一种获取代理本身的方法。

请注意,正如我所关心的,这种行为不是 hibernate 中的错误,因为它已被多次报告为错误,但开发人员建议这是在某些条件下发生的 hibernate 的正常行为。

最佳答案

对于(如您所说)某些类型的代码,我使用“deproxy()”和其他几个辅助函数。

这使得 Spring 的“自动增长”路径绑定(bind)工作,在通过 Hibernate 加载可能的子类实体时检查实际类型以及代理导致事情中断的各种其他有趣的极端情况是必要的。

public class HbUtils {

public static <T> T deproxy (T obj) {
if (obj == null)
return obj;
if (obj instanceof HibernateProxy) {
// Unwrap Proxy;
// -- loading, if necessary.
HibernateProxy proxy = (HibernateProxy) obj;
LazyInitializer li = proxy.getHibernateLazyInitializer();
return (T) li.getImplementation();
}
return obj;
}


public static boolean isProxy (Object obj) {
if (obj instanceof HibernateProxy)
return true;
return false;
}

// ----------------------------------------------------------------------------------


public static boolean isEqual (Object o1, Object o2) {
if (o1 == o2)
return true;
if (o1 == null || o2 == null)
return false;
Object d1 = deproxy(o1);
Object d2 = deproxy(o2);
if (d1 == d2 || d1.equals(d2))
return true;
return false;
}

public static boolean notEqual (Object o1, Object o2) {
return ! isEqual( o1, o2);
}

// ----------------------------------------------------------------------------------

public static boolean isSame (Object o1, Object o2) {
if (o1 == o2)
return true;
if (o1 == null || o2 == null)
return false;
Object d1 = deproxy(o1);
Object d2 = deproxy(o2);
if (d1 == d2)
return true;
return false;
}

public static boolean notSame (Object o1, Object o2) {
return ! isSame( o1, o2);
}



// ----------------------------------------------------------------------------------

public static Class getClassWithoutInitializingProxy (Object obj) {
if (obj instanceof HibernateProxy) {
HibernateProxy proxy = (HibernateProxy) obj;
LazyInitializer li = proxy.getHibernateLazyInitializer();
return li.getPersistentClass();
}
// Not a Proxy.
return obj.getClass();
}

}

我在每个主要的 Hibernate 项目中都使用这样的类。 PS:这不是我唯一的 Hibernate 助手——我有一个用于一般获取 ID 并检查实体是否是新的/存在的。

希望这可以帮助!

关于spring - hibernate JavassistLazyInitializer : problems with validation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16383742/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com