JPA
-
코틀린에서 Data클래스에 JPA를 사용할 때 주의해야 할 점KOTLIN 2022. 11. 27. 14:27
코틀린의 data 클래스를 JPA와 함께 사용하려던 도중 몇가지 문제가 발생하여 알아보았다. 기본생성자 코틀린에서 data타입을 이용한 객체를 구현하여 JPA를 사용할 때 기본생성자를 작성해주어야한다. 이전 자바 공부할 때 배웠듯이 JPA의 경우 reflection을 이용해서 구현되기 때문에 기본생성자가 필수이다. @Entity data class Restaurant( @Id @GeneratedValue(strategy = GenerationType.AUTO) var id: Long? = null, @Column(unique = true, nullable = false) var name: String ) { constructor() : this(null, "") } 하지만 매번 기본생성자를 생성하기 위한..
-
Validation failed for query for method public abstract 오류 발생시 (JPA)Spring 2022. 3. 4. 22:26
existsBy를 이용하여 연관관계의 데이터 아이디로 데이터 존재여부를 아는 쿼리를 작성하려고 할때 알맞은 쿼리임에도 쿼리 실패 오류가 발생했다. 기존의 코드 @Query(value = "SELECT CASE WHEN count(f) > 0 THEN true ELSE false END FROM Follow f LEFT JOIN FETCH f.fromUser a LEFT JOIN FETCH f.toUser b WHERE a.id=:fromUserId AND b.id=:toUserId") boolean existsByFromUserIdAndToUserId(Integer fromUserId, Integer toUserId); 기존코드를 보면 네이티브 쿼리로 작성되어 있으므로 수정한 코드 @Query(value..
-
existsBy, countBy (JPA)Spring 2022. 2. 13. 18:52
미션을 진행하다가 넘어온 아이디로 조회한 객체가 존재하지 않을 때 예외를 발생시켜야 하는 부분에서 실제 객체를 찾고 null객체인지 확인하는 방법으로 체크를 하였는데 이 부분을 existsBy로 하여 JPA를 활용하도록 피드백을 받게 되었다. null 객체 확인 방법 ( 기존에 하던 방법 ) public ReviewDTO update(ReviewCreateDTO reviewCreateDTO) { if (reviewRepository.findById(reviewCreateDTO.getId()) == null) { throw new ReviewNotFoundException(); } } 하려고 하는 의도가 어떤 것인지 명확하지 않고 불필요한 부분이 존재한다. existsBy public ReviewDTO u..
-
JPA 엔티티에 생성 시점, 수정 시점 Timestamp 추가하기 ( + Auditing)Spring 2022. 1. 13. 09:19
프로젝트 엔티티를 구성할 때 엔티티에 중복으로 created_at, updated_at 등의 생성 시간, 업데이트 시간을 column으로 중복적으로 필요해질 때가 있다. 이럴 때 JPA Auditing을 사용해서 시점 생성을 자동화 할 수 있다. BaseTImeEntity 생성 @MappedSuperclass @EntityListeners(AuditingEntityListener.class) public abstract class BaseTimeEntity { @CreatedDate @Column(nullable = false) private LocalDateTime createdAt; @LastModifiedDate private LocalDateTime updatedAt; public LocalDat..
-
JPA getById() 와 findById()의 차이Spring 2022. 1. 12. 22:33
jpa에서 ID를 이용하여 객체를 가져오는 방법에는 getById(), findById() 두가지 방법이 존재한다. getById() public void get_activity_with_id(Integer id) { //given //when Activity activity = repo.getById(id); //then } getById()는 원래 메소드인 getOne()이 deprecated되어 대체된 메소드로 내부적으로 EntityManager.getReference() 메소드를 호출하여 엔티티가 아닌 프록시를 반환한다. 이 때문에 실제로 사용하기 전에는 데이터 베이스에 접근하지 않고 실제로 사용될 때 프록시에서 데이터 베이스에 접근하려고 할때 데이터가 존재하지 않는다면 EntityNotFound..
-
Data too long for column 오류 발생시Spring 2021. 11. 6. 11:52
컬럼에 기본 설정된 바이트 길이보다 들어온 데이터의 바이트 길이가 커서 발생하는 오류이다. 해당 컬럼의 길이를 늘려주면 해결된다. @Column(length = 늘이고자 하는 길이) String name; (참고한 사이트) https://scshim.tistory.com/337 [JPA] 오류 해결: “Data too long for column” Spring Data JPA를 통해 아래와 같은 엔티티로 MySQL 데이터베이스에 테이블을 생성한다고 가정하자. @Entity public class SurveyAnswer { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) Long id; Lo.. scshim.tistory.com
-
JPA delete 쿼리가 실행되지 않을 때Spring 2021. 10. 26. 16:44
프로젝트 진행시에 JPA를 사용하면서 따로 쿼리설정을 해주지 않아도 findBy(column)의 형태가 가능하였다. 그래서 deleteBY(column)의 형태를 사용하려고 하였으나 데이터가 삭제되지 않았다 원인 EntityManager open -> SELECT 쿼리 실행 -> EntityManager closed -> DELETE쿼리 예외 발생 의 순으로 진행되기 되는데 이는 @Transactional 어노테이션이 붙어있는 JPARepository에 deleteBy...의 형태가 없기 때문이다. 해결 다음과 같이 사용하고자하는 deleteBy...에 @Transactional어노테이션을 붙여 해결하였다. public interface PostImageRepository extends JpaReposi..