9

データベースから遅延ロードされたオブジェクトに関連する問題に対処しています。

以下のエンティティがあるとしましょう。

@Entity(name = "User")
@Table(name = "USERS")
public class User{
    @Id
    @GeneratedValue
    private int id

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="NOTES_ID")
    private List<Note> notes;
}

そして、Dtoは

@Mapper
public interface UserDtoMapper{

    /** the INSTACE HERE **/

    User fromDto(UserDto dto);

    UserDto toDto(User user);

}

では、怠惰なユーザーを取得しているため、EJBException を発生させずにすべてのユーザーを取得するための最良の方法はどれでしょうか?

編集:解決策

次のデータモデルがあるとしましょう

public class User{

    private String name;

    //... other fields

    @OneToMany
    private Set<Address> addresses;
}
  1. アドレスなしのクエリ、例外: モデルから DTO にマッピングする場合、マッピングを試みますaddressesが、(hibernate またはその他のフレームワークを介して) 遅延ロードされるため、例外が発生します。

さらにaddresses、 @Mehmet Bektaş のように、マップされている from を無視できます。ただし、 を定義する必要はありませんsource。オプションです。

@Mapping(target = "addresses", ignore = true)
  1. リレーションシップの取得: これが方法です。joinクエリに a を追加するaddressesと、Mapstruct が残りを行います。
4

2 に答える 2

0

Mapstruct を使用して、マッピングを行うときに必要なすべてのエンティティを遅延ロードできます (セッションがまだアクティブであると仮定します)。不要なアンロードされたプロキシは、ignore アノテーションを使用して無視できます。詳細はこちら。 MapStruct は Hibernate エンティティ クラスのディープ デプロキシを実行できますか

于 2017-02-10T22:03:44.730 に答える