有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java LazyInitializationException以最简单的方式使用OneToMany

我在jpa中使用Hibernate,我正在尝试做一件非常简单的事情。我知道LazyinizalizationException是什么意思,但我不明白为什么在我用最普通、最简单的方式做每件事的时候,它会出现。这是关系的“一面”:

@Entity
public class User implements Serializable{

@Id @GeneratedValue
private int idUser;

private String name;
private String surname;
private String username;

@OneToMany(mappedBy="user")
private List<Device> dev;

...getters and setters...

这是“多”的一面:

@Entity
public class Device implements Serializable {

@Id @GeneratedValue
private int idDevice;

private String brand;
private String model;

@ManyToOne
@JoinColumn(name="user_fk")
private User user;

...getters and setters...

引发异常的jUnit测试是:

@Test
public void testLazyUserSnd() {
    User u = uDao.getUser(2);
    List<Device> devList = u.getDev();
    Device aDevice = devList.get(0); // <--- Here the exception is thrown
    aDevice.getModel();

我建立了Hibernate Documentation中解释的关系。有什么提示吗?我是不是犯了一些又大又愚蠢的错误


共 (1) 个答案

  1. # 1 楼答案

    尽管@Xavi的答案非常合理,但您可能并不总是希望为用户加载设备。如果没有,有两种方法可以解决这个问题

    1. 创建一个额外的方法uDao。getUserWithDevices(id)并在知道需要设备时调用它,否则调用uDao。getUser(id)
    2. 在事务中封装测试方法,从而封装使用该方法的任何生产代码。换句话说,只要你需要,就让课程一直开放

    就我个人而言,我会使用事务方法,因为它允许更大的灵活性,并允许JPA在需要时延迟加载。有关会话生命周期的更多有趣信息,请参见http://community.jboss.org/wiki/OpenSessionInView