Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate JPA。FetchType.Lazy导致了奇怪的行为@ManyToOne_Hibernate_Jpa_Many To One_Jpa 2.1 - Fatal编程技术网

Hibernate JPA。FetchType.Lazy导致了奇怪的行为@ManyToOne

Hibernate JPA。FetchType.Lazy导致了奇怪的行为@ManyToOne,hibernate,jpa,many-to-one,jpa-2.1,Hibernate,Jpa,Many To One,Jpa 2.1,我正在努力提高一个使用JPA的项目的性能 我正在使用JPA2.1和Hibernate5.0.1实现 我将manytone关系的类型改为Lazy,所以它就爆炸了 当我尝试查找子对象的所有记录时:最后一条记录包含所有空字段,并且带有一个handler=javassistlazinitializer。这种奇怪的行为会影响使用这些对象的字段(比如h:OneSelectMenu) 如果我删除FetchType,那么事情就会恢复正常 一些印刷品: 第二次打印的代码(FetchType.Lazy): }

我正在努力提高一个使用JPA的项目的性能

我正在使用JPA2.1和Hibernate5.0.1实现


我将manytone关系的类型改为Lazy,所以它就爆炸了

当我尝试查找子对象的所有记录时:最后一条记录包含所有空字段,并且带有一个handler=javassistlazinitializer。这种奇怪的行为会影响使用这些对象的字段(比如h:OneSelectMenu)

如果我删除FetchType,那么事情就会恢复正常

一些印刷品:

第二次打印的代码(FetchType.Lazy):

}

公共类TipoUsuario实现了可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@基本(可选=假)
@NotNull
@尺寸(最小值=1,最大值=1)
@列(name=“Id\u Tipo\u Usuario”)
私有字符串idTipoUsuario;
@基本(可选=假)
@NotNull
@尺寸(最小值=1,最大值=20)
@列(name=“descripao”)
私有字符串描述符;
@基本(可选=假)
@NotNull
@尺寸(最小值=1,最大值=1)
@列(name=“Possui\u主管”)
私有字符串拥有者监督;
@尺寸(最大值=1)
@列(name=“Possui\u Meta”)
私有字符串possuiMeta;
@尺寸(最大值=1)
@列(name=“Recebe\u Alerta”)
私有字符串接收器;
@短暂的
private List usuarioList=new ArrayList();
//构造函数、getter setter等。。。
为什么

通过延迟加载,您指示
EntityManager
除非有人要求,否则不要获取这些详细信息。因此,如果在事务中,您没有要求获取该
属性
,您将只获取该属性的代理。但是,如果您要求该代理获取与该属性相关的任何内容,则e.x的大小,
EntityManager
将按需为您获取该信息

看起来您正在将JSF用于视图,在本例中,在您的模型询问这些详细信息之前,实体管理器已经完成了它的工作,因此不知道它必须再次为您从DB获取这些详细信息。请记住,代理是序列化的,因此在您的视图中,您的集合看起来是空的

如何避开这个问题

正确答案取决于你的用法

如果当前延迟加载的信息总是需要显示在前端,那么延迟加载对您没有好处

否则,如果您需要仅在有人单击下拉列表或其他内容时显示它,那么您可以使用
Fetch Joins
基于JPA查询填充这些值

否则,如果您有EJB,您可以考虑扩展
EntityManager

每个选项都有很多细节,但是你可以从Adam Bien那里了解更多关于上面提到的所有选项的细节

更新1:看看这个,看看如何在服务器端加载延迟加载的属性。

为什么

通过延迟加载,您指示
EntityManager
除非有人要求,否则不要获取这些详细信息。因此,如果在事务中,您没有要求获取该
属性
,您将只获取该属性的代理。但是,如果您要求该代理获取与该属性相关的任何内容,则e.x的大小,
EntityManager
将按需为您获取该信息

看起来您正在将JSF用于视图,在本例中,在您的模型询问这些详细信息之前,实体管理器已经完成了它的工作,因此不知道它必须再次为您从DB获取这些详细信息。请记住,代理是序列化的,因此在您的视图中,您的集合看起来是空的

如何避开这个问题

正确答案取决于你的用法

如果当前延迟加载的信息总是需要显示在前端,那么延迟加载对您没有好处

否则,如果您需要仅在有人单击下拉列表或其他内容时显示它,那么您可以使用
Fetch Joins
基于JPA查询填充这些值

否则,如果您有EJB,您可以考虑扩展
EntityManager

每个选项都有很多细节,但是你可以从Adam Bien那里了解更多关于上面提到的所有选项的细节


更新1:看看这个,看看如何在服务器端加载延迟加载的属性。

您好,您能在问题中添加stacktrace作为文本吗?图像可能会被阻止,读取/复制起来很麻烦。我想知道为什么您没有触发
org.hibernate.lazyiInitializationException
,可以吗您发布了休眠和持久化config@Dubes,好的!我更改了,但第一次打印不是代码。您好,您可以在问题中添加stacktrace作为文本吗?图像可能会被阻止,并且读取/复制起来很麻烦。我想知道为什么您没有触发
org.hibernate.LazyInitializationException
,您可以发布hibernate吗和坚持config@Dubes,好的!我更改了,但是第一次打印不是代码。当我简单地调用“SELECT t FROM TipoUsuario t”时,会出现奇怪的行为(如打印“Debug child list 2”中所示)。一个单独的调用:(假设属性是t中的tipoUsario,当您发出一个简单的SELECT时,JPA将不会获取LazyLoaded属性。您必须明确要求JPA为您执行此操作。请尝试将查询更改为以下内容,并让我知道如何执行
SELECT t FROM TipoUsuario t JOIN fetch t.TipoUsuario
,这是指向r如果您感兴趣,请加入fetch。谢谢您的帮助,但是TipoUsuario中没有复杂的类型。我编辑了文章并包含了TipoUsuario类型。当我简单地调用“从TipoUsuar中选择t”时,会出现奇怪的行为(如打印“调试子列表2”中所示)
public class Usuario implements Serializable {
  private static final long serialVersionUID = 1L;

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

// Fields ...

@JoinColumn(name = "Id_Tipo_Logradouro", referencedColumnName = "Id_Tipo_Logradouro", nullable = true)
@ManyToOne(optional = true, fetch = FetchType.LAZY)
private TipoLogradouro tipoLogradouro;

@JoinColumn(name = "Id_Tipo_Usuario", referencedColumnName = "Id_Tipo_Usuario")
@ManyToOne(optional = false, fetch = FetchType.LAZY)
private TipoUsuario tipoUsuario;

@JoinColumn(name = "Id_Supervisor", referencedColumnName = "Id_Usuario")
@ManyToOne(optional = true, fetch = FetchType.LAZY)
private Usuario supervisor;

// Contructor, Getters Setters etc ...
public class TipoUsuario implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 1)
@Column(name = "Id_Tipo_Usuario")
private String idTipoUsuario;

@Basic(optional = false)
@NotNull
@Size(min = 1, max = 20)
@Column(name = "Descricao")
private String descricao;

@Basic(optional = false)
@NotNull
@Size(min = 1, max = 1)
@Column(name = "Possui_Supervisor")
private String possuiSupervisor;

@Size(max = 1)
@Column(name = "Possui_Meta")
private String possuiMeta;

@Size(max = 1)
@Column(name = "Recebe_Alerta")
private String recebeAlerta;

@Transient
private List<Usuario> usuarioList = new ArrayList<>();

//Contructor, Getters Setters etc ...