web-dev-qa-db-ja.com

Spring Data、JPA @OneToMany Lazy fetchがSpring Bootで機能しない

FabricRollFabricDefectの間に_@OneToMany_の関係があります。

_@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "fabric_roll_id", referencedColumnName = "fabric_roll_id")
private Set<FabricDefect> fabricDefects = new HashSet<>();
_

問題は、FabricRoll関数によってJpaRepositoryを取得するときです

findAll()

仲間FabricDefectもロードされます。

関数getFabricDefect()を呼び出すときにFabricRollFabricDefectのみをロードする必要があります

FabricRollServiceImplクラス

_@Component
public class FabricRollServiceImpl implements IFabricRollService{
    @Autowired
    FabricRollRepository fabricRollRepository;

    @Transactional(propagation = Propagation.REQUIRED)
    @Override
    public List<FabricRoll> getAllFabricRoll() {
        FabricRoll fabricRoll1 = new FabricRoll();
        fabricRoll1.setBatchNo("34344");
        fabricRoll1.setLotNo("425");
        fabricRoll1.setPoNo("42");
        fabricRoll1.setRollLength(2343);
        fabricRoll1.setRollNo("356");
        fabricRoll1.setRollWidth(60);
        fabricRoll1.setStyleNo("354");

        FabricDefect fabricDefect = new FabricDefect();
        fabricDefect.setDefectNote("note");
        fabricDefect.setDefectPoint(3);
        fabricDefect.setSegment(3);
        fabricDefect.setYard(42);


        Set<FabricDefect> fabricDefects = new HashSet<>();
        fabricDefects.add(fabricDefect);


        fabricRoll1.setFabricDefects(fabricDefects);

        addFabricRoll(fabricRoll1);

        FabricRoll fabricRoll = null;


        return fabricRollRepository.findAll();
    }

@Override
public void addFabricRoll(FabricRoll fabricRoll) {
    fabricRollRepository.save(fabricRoll);
}
_

}

ブレークポイント: enter image description here

コンソール: - enter image description here

11
NIROB AECE

FabricDefectクラス:

@ManyToOne
@JoinColumn(name = "fabric_roll_id")
private FabricRoll roll;

FabricRollクラス:

@OneToMany(mappedBy = "roll")
private Set<FabricDefect> fabricDefects;

コレクションはデフォルトで遅延読み込みされます。JPAは、メソッドgetFabricDefectsが呼び出される場合にのみデータベースにクエリを実行します。自分でログを有効にして確認できます。

0
Manza

@JoinColumnを使用する必要はありません。また、fabricDefectsをインスタンス化する必要もありません。

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private Set<FabricDefect> fabricDefects ; 

詳細は this の質問を参照してください。

0
Azzabi Haythem

このチュートリアル で解決策を見つけました。

FabricRollOneToManyマップを次のように変更する必要があります。

_@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "fabricRoll")
private Set<FabricDefect> fabricDefects;
_

FabricDefectManyToOne以下のとおり(エンティティに含めた場合は、_fabric_roll_id_フィールドを削除してください):

_@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "fabric_roll_id")
private FabricRoll fabricRoll;
_

また、@Transactional(propagation = Propagation.REQUIRED)関数の前にgetAllFabricRoll()を追加する必要はありません。

0
Huy Quang