data jpa 에서의 save 메서드의 내부 로직은 이렇다public S save(S entity) { Assert.notNull(entity, "Entity must not be null"); if (entityInformation.isNew(entity)) { entityManager.persist(entity); return entity; } else { return entityManager.merge(entity); } }주어진 엔티티가 일단 새로운 엔티티인지 아닌지를 판단한다.이는 entityInformation.isNew(entity) 를 통해 이루어진다.entityInformation 은 엔티티에 대한 메타데이터를 제공하는 클래스이며isNew 는 엔티티가 새로운 것인지 아닌지를 판단하는 로..
@Test void transactionalEntityEqualsTest() { Member member = new Member("테스트", null); memberService.join(member); Member findMember = memberService.findMember(member.getId()); System.out.println("findMember = " + findMember); System.out.println("findMember == member = " + (findMember == member)); System.out.println("findMember.equals(member) = " + findMember.equals(member)); }@Service @RequiredA..
엔티티의 동등성 비교법비즈니스 키를 사용해 equals() 메서드를 오버라이딩해야함프록시와 동등성 비교 문제단순 원본 엔티티끼리의 비교에서는 IDE 나 외부 라이브러리가 제공한 equals 로 충분하지만..프록시 객체와의 비교에서는 문제가 발생함@Entity public class Member { @Id private String id; private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null..
N+1?연관된 엔티티를 로드할 때 발생한다.한 개의 쿼리로 N 개의 엔티티를 로드 후각 엔티티와 연관된 다른 엔티티들을 로드하기 위해추가적으로 N 번의 쿼리를 수행하게 됨.최종적으로 N + 1 의 호출이 발생하는 것이다.예제로 알아보자@Entity public class Member { @Id @GeneratedValue private Long id; @OneToMany(mappedBy = "member", fetch = FetchType.EAGER) private List orders = new ArrayList(); } @Entity @Table(name = "ORDERS") public class Order { @Id @GeneratedValue private Long id; @ManyToOne p..
엔티티의 데이터를 데이터베이스에 저장할 때 변환하는 역할을 수행한다.Java 의 boolean 타입을 데이터베이스에 문자열 ‘Y’ 혹은 ‘N’ 으로 저장할때.. 사용한다고 함.분석DB 테이블 생성CREATE TABLE MEMBER ( ID VARCHAR(255) NOT NULL, USERNAME VARCHAR(255), VIP VARCHAR(1) NOT NULL, PRIMARY KEY (ID) )회원 엔티티@Entity public class Member { @Id private String id; private String username; @Convert(converter=BooleanToYNConverter.class) private boolean vip; // Getter, Setter }@Con..
JPA 사용 환경의 비교J2SE 환경개발자가 엔티티 매니저 생성 및 트랜잭션 관리가 필요하다스프링/J2EE 컨테이너컨테이너가 제공하는 전략을 따라야 한다.스프링 컨테이너의 기본 전략트랜잭션 범위의 영속성 컨텍스트트랜잭션을 시작하는 경우영속성 컨텍스트를 생성종료시영속성 제거구현@Transactional 어노테이션스프링의 트랜잭션의 관리트랜잭션 AOP메서드 호출 전트랜잭션 시작메서드 정상 종료트랜잭션 커밋 및 종료영속성 플러시변경내용을 DB에 반영예외가 발생하는 경우트랜잭션을 롤백하고 , 플러시를 호출하지 않는다.코드예제@Controller class HelloController { @Autowired HelloService helloService; public void hello() { // 반환된 mem..