FabricRoll
とFabricDefect
の間に_@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()
を呼び出すときにFabricRoll
とFabricDefect
のみをロードする必要があります
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);
}
_
}
FabricDefectクラス:
@ManyToOne
@JoinColumn(name = "fabric_roll_id")
private FabricRoll roll;
FabricRollクラス:
@OneToMany(mappedBy = "roll")
private Set<FabricDefect> fabricDefects;
コレクションはデフォルトで遅延読み込みされます。JPAは、メソッドgetFabricDefects
が呼び出される場合にのみデータベースにクエリを実行します。自分でログを有効にして確認できます。
@JoinColumn
を使用する必要はありません。また、fabricDefectsをインスタンス化する必要もありません。
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private Set<FabricDefect> fabricDefects ;
詳細は this の質問を参照してください。
このチュートリアル で解決策を見つけました。
FabricRoll
OneToMany
マップを次のように変更する必要があります。
_@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "fabricRoll")
private Set<FabricDefect> fabricDefects;
_
FabricDefect
ManyToOne
以下のとおり(エンティティに含めた場合は、_fabric_roll_id
_フィールドを削除してください):
_@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "fabric_roll_id")
private FabricRoll fabricRoll;
_
また、@Transactional(propagation = Propagation.REQUIRED)
関数の前にgetAllFabricRoll()
を追加する必要はありません。