일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 힙
- PS
- CHECK OPTION
- 유니크제약조건
- exclusive lock
- 연관관계
- 스프링 폼
- 즉시로딩
- 비관적락
- 이진탐색
- 연결리스트
- BOJ
- eager
- SQL프로그래밍
- 지연로딩
- 일대다
- fetch
- execute
- FetchType
- querydsl
- dfs
- 백트래킹
- 동적sql
- 데코레이터
- 다대일
- shared lock
- 스토어드 프로시저
- 낙관적락
- JPQL
- 다대다
- Today
- Total
목록전체 글 (555)
흰 스타렉스에서 내가 내리지
JPQL ★ JPQL은 엔티티 객체를 조회하는 객체지향 쿼리다. JPQL은 SQL을 추상화해서 특정 데이터베이스에 의존하지 않는다. Criteria Criteria는 JPQL을 생성하는 빌더 클래스다. Criteria의 장점은 문자가 아닌 query.select(m).where(...) 처럼 프로그래밍 코드로 JPQL을 작성할 수 있다는 점이다. JPQL에서 오타가 있다면, 컴파일은 성공하고 런타임 시점에 오류가 발생한다. 이것이 문자기반 쿼리의 단점이다. 반면에 Criteria는 문자가 아닌 코드로 JPQL을 작성한다. 따라서 컴파일 시점에 오류를 발견할 수 있다. CriteriaQuery cq = query.select(m).where(cb.equal(m.get("username"), "kim"));..
값 타입을 하나 이상 저장하려면 컬렉션에 보관하고 @ElementCollection, @CollectionTable 어노테이션을 사용하면 된다. @Entity @Getter @Setter public class Member{ @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; @Embedded private Address homeAddress; @ElementCollection @CollectionTable(name = "FAVORITE_FOODS", joinColumns = @JoinColumn(name = "MEMBER_ID")) @Column(name = "FOOD_NAME") private Set favoriteFoods = new ..

임베디드 타입 (복합 값 타입) public class Member{ @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; @Embedded Period workPeriod; @Embedded Address homeAddress; @Embeddable public class Period { @Temporal(TemporalType.DATE) Date startDate; @Temporal(TemporalType.DATE) Date endDate; } @Embeddable public class Address { @Column(name = "city") private String city; private String street; private ..
영속성 전이 : 저장 - CascadeType.PERSIST @Entity public class Parent{ ... @OneToMany(mappedBy = "parent", cascade = CascadeType.PERSIST) private List children = new ArrayList(); ... } CascadeType.PERSIST 는 부모를 영속화할 때 연관된 자식들도 함께 영속화하게 한다. 그래서 부모를 영속화했으면 자식들을 영속화하는 코드를 따로 작성할 필요가 없다. 영속성 전이 : 삭제 - CascadeType.REMOVE 부모 엔티티만 삭제하면 연관된 자식 엔티티도 함께 삭제된다. CASCADE의 종류 public enum CascadeType{ ALL,//모두 적용 PERSI..
엔티티를 조회할 때 사용하지 않는 연관된 엔티티까지 데이터베이스에서 함께 조회해 두는 것은 효율적이지 않다. JPA는 이런 문제를 해결하려고 엔티티가 실제 사용될 때까지 데이터베이스 조회를 지연하는 방법을 제공하는데 이것을 지연로딩이라고 한다. team.getName() 처럼 팀 엔티티 값을 실제 사용하는 시점에 데이터베이스에서 팀 엔티티에 필요한 데이터를 조회하는 것이다. 그런데 지연로딩 기능을 사용하려면 실제 엔티티 객체 대신에 데이터베이스 조회를 지연할 수 있는 가짜 객체가 필요한데 이것을 프록시 객체라고 한다. Member member = em.find(Member.class, "member1"); 이렇게 엔티티를 직접 조회하면 조회한 엔티티를 실제 사용하든 사용하지 않든 데이터베이스를 조회하게 ..

일대일 조인 테이블 @Entity @Getter @Setter public class Parent { @Id @GeneratedValue @Column(name = "PARENT_ID") private Long id; private String name; @OneToOne @JoinTable(name = "PARENT_CHILD", joinColumns = @JoinColumn(name = "PARENT_ID"), inverseJoinColumns = @JoinColumn(name = "CHILD_ID") ) private Child child; } @Entity @Getter @Setter public class Child { @Id @GeneratedValue @Column(name = "CHILD_..

자식 테이블의 기본 키 값으로 부모 테이블의 기본 키 값만 사용한다. @Entity public class Board { @Id @GeneratedValue @Column(name = "BOARD_ID") private Long id; private String title; @OneToOne(mappedBy = "board") private BoardDetail boardDetail; } @Entity public class BoardDetail { @Id private Long boardId; @MapsId //BoardDetail.boardId 매핑 @OneToOne @JoinColumn(name = "BOARD_ID") private Board board; private String content;..

sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080 삭제하기 sudo iptables -t nat -L --line-numbers sudo iptables -t nat -D PREROUTING 1

부모, 자식, 손자까지 계속 기본 키를 전달하는 식별 관계다. 식별 관계에서 자식 테이블은 부모 테이블의 기본 키를 포함해서 복합 키를 구성해야 하므로 @IdClass 나 @EmbeddedId를 사용해서 식별자를 매핑해야 한다. @IdClass와 식별관계 @Entity @Getter @Setter public class Parent { @Id @Column(name = "PARENT_ID") private Long id; private String name; } @Entity @Getter @Setter @IdClass(ChildId.class) public class Child { @Id @ManyToOne @JoinColumn(name = "PARENT_ID") public Parent parent;..

@Entity public class Hello{ @Id private String id1; @Id private String id2; } 둘 이상의 컬럼으로 구성된 복합 기본 키는 위의 코드처럼 하면 매핑 오류가 발생한다. JPA에서 식별자를 둘 이상 사용하려면 별도의 식별자 클래스를 만들어야 한다. JPA는 영속성 컨텍스트에 엔티티를 보관할 때 엔티티의 식별자를 키로 사용한다. 그리고 식별자를 구분하기 위해 equals와 hashCode를 사용해서 동등성 비교를 한다. 그런데 식별자 필드가 하나일 때는 보통 자바의 기본 타입을 사용하므로 문제가 없지만, 식별자 필드가 2개 이상이면 별도의 식별자 클래스를 만들고 그곳에 equals와 hashCode를 구현해야 한다. JPA는 복합 키를 지원하기 위해 ..