0

Employeeエンティティのリストを取得しようとすると、次のエラーが発生します。

org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch 
multiple bags

私のEmployeeエンティティクラスには、異なるオブジェクトの2つのリストがあります。問題があると思います。

@ManyToMany
@JoinTable(name = "employee_project",
        joinColumns = {@JoinColumn(name = "employee_id", referencedColumnName = "employee_id")},
        inverseJoinColumns = {@JoinColumn(name = "project_id", referencedColumnName = "project_id")})
protected List<Project> projects;

@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "employee_id")
protected List<EmployeeTheme> themes;

私のエンティティProjectには、現時点ではEmployeeオブジェクトのリストがありません。だが

public class EmployeeTheme implements Serializable {

    @EmbeddedId
    private EmployeeTheme PK id;

    @ManyToOne
    @JoinColumn(name = "employee_id", nullable = false, insertable = false, updatable = false)
    protected Employee employee;
}

そして、これは複合キーの私のクラスです:

@Embeddable
public class EmployeeThemePK implements Serializable {

    @Column(name = "employee_id")
    protected Long employeeId;

    @Column(name = "theme")
    protected String theme;
}

これらの関係を適切に構成するにはどうすればよいですか?

編集

テーマとプロジェクトのリストをセットに切り替えました。そして、JSONテーマから除外しましたが、別の例外が発生しています。criteria.setFetchMode("projects", FetchMode.JOIN);DAOクラスのメソッドにも追加しました。

failed to lazily initialize a collection of role: com.package.Employee.projects,
no session or session was closed
org.hibernate.LazyInitializationException: failed to lazily initialize a 
collection of role: com.package.Employee.projects, no session or session 
was closed


Exception caught during request processing: flexjson.JSONException: Error 
trying to deepSerialize
flexjson.JSONException: Error trying to deepSerialize
4

2 に答える 2

1

この例外は、従業員を獲得し、従業員のテーマとプロジェクトを熱心に取得しているためにトリガーされます。

まず、本当に両方が必要であることを確認してください。

次に、このようにすることで、デカルト積を作成していることを認識します。従業員が100のプロジェクトと100のテーマを持っている場合、クエリはこの従業員に対してのみ10,000行を返します。たぶん、最初にプロジェクトで従業員をフェッチし(100行)、次にテーマで従業員を再フェッチする必要があります(再び100行)。

第三に、デカルト積が本当に必要なものである場合は、コレクションの少なくとも1つをリストではなくセットにします。

于 2012-12-14T13:23:22.463 に答える
0

DAOで使用Hibernate.initialize()して、メインオブジェクトに関連する特定の属性をフェッチできます。これにより、データの読み込みを回避できます。おそらく、次のようなものは必要ありません。

q = this.entityManager.createQuery('SQL..');
employee= q.getSingleResult();
Hibernate.initialize(employee.themes);
于 2015-10-15T13:48:23.967 に答える