코딩하는 털보

21.11.05 TIL 본문

Diary/Today I Learned

21.11.05 TIL

이정인 2021. 11. 6. 03:33

오늘의 삽질

JPQL Query

필요 SQL, 오늘이 duration 시작과 끝 사이에 있는지 확인해야함.

select * from habit
where user_id = 3
and practice_days like '%5%'
and duration_end >= '2021-11-05'
and duration_start <= '2021-11-05';

@Query("select h from HabitWithCounter h " +
        "where h.user = :user " +
        "and h.practiceDays like %:day% " +
        "and h.durationStart <= :today " +
        "and h.durationEnd >= :today")
List<Habit> findTodayHabitListByUser(User user, int day, LocalDate today);

[오류]org.hibernate.PersistentObjectException: detached entity passed to persist

@OneToOne(fetch = FetchType.LAZY, cascade = {CascadeType.ALL})
private User user;
Monster newMonster = Monster.createNewMonster(user, monsterName, monsterDatabase);
monsterRepository.save(newMonster);
user.updateMonster(newMonster);

CascadeType.ALL 상황에서 save할 때 user는 이미 있으므로 save 안됨.
Entity 설계가 잘못되어 있는것으로 판단하고 연관 관계의 주인을 User로 바꾸고 CascadeType을 제거.

[오류]TransientPropertyValueException: object references an unsaved transient instance

@Transactional
public User updateMonster(User user, Monster newMonster) {
    user.updateMonster(newMonster);
    return userRepository.save(user);
}

FK로 쓰는 객체가 아직 저장이 안 되서 오류

@OneToOne(fetch = FetchType.LAZY, cascade = {CascadeType.ALL})
private Monster monster;

CascadeType으로 save 할 때 user에 set된 객체까지 같이 저장하게 할 수 있다.

Comments