【问题标题】:Lazy Initialization Exception on Initialize a Collection - JPA初始化集合时出现延迟初始化异常 - JPA
【发布时间】:2018-01-14 19:06:45
【问题描述】:

我实现了一个简单的 SpringMVC 应用程序。作为模型,我有PersonEvent 都映射到H2 database

现在我可以存储一个Person 对象和一个Event 对象。但是当我试图将Person 的列表存储到我的Event 对象时,我总是会遇到异常:

延迟初始化集合失败,无法初始化代理 - 没有会话

到目前为止我的方法:

@Entity
public class Event implements Persistable<Long> {

      private static final long serialVersionUID = 1L;

      @Id
      @GeneratedValue(strategy = GenerationType.AUTO)
      private Long id;

      private String eventName;

      @OneToMany(fetch = FetchType.EAGER)
      @ElementCollection(targetClass = Member.class)
      private List<Person> members = new ArrayList<>();
}

@Entity
public class Person implements Persistable<Long>{

      private static final long serialVersionUID = 1L;

      @Id
      @GeneratedValue(strategy = GenerationType.AUTO)
      private Long id;

      private String firstname;
      private String lastname;
}

目标是选择具有素面SelectManyMenuPerson 对象并将它们存储到事件的List&lt;Person&gt; members。当我通过SQL 将一些Person 对象添加到Event 时,SelectManyMenu 会正确地预先选择添加的Person 对象。但是当我选择一个额外的Person 对象并调用save 时,就会出现异常。

首先我认为我的save-方法不起作用。但它必须正常工作,因为我能够分别保存Person 对象和Event 对象(之间没有Relationship)。

【问题讨论】:

    标签: java hibernate spring-mvc jpa primefaces


    【解决方案1】:

    要正确映射,您应该将members 字段映射为@OneToMany(mappedBy = "event", fetch = ...),并在您的Person 类中添加@ManyToOne Event event。您还可以通过阅读fetching strategies 文档来确定需要使用什么获取策略。

    【讨论】:

    • 这意味着一个人只能参加一个活动? .. 一个人应该被允许参加许多活动
    • 如果一个事件应该允许多人参与,你应该同时使用@ManyToMany映射。
    • 我尝试了@ManyToMany 两者的映射。我的Person@ManyToMany(fetch = FetchType.EAGER) 注释设置在Event@ManyToMany(mappedBy="members", fetch = FetchType.EAGER) 注释我的Event 设置在Person 但仍然没有成功。我有什么问题吗?
    猜你喜欢
    • 2012-08-01
    • 2020-05-10
    • 1970-01-01
    • 2012-07-27
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多