원리보단 실증적인 용도, 사용법 위주로 서술.
ORM :: https://en.wikipedia.org/wiki/Object–relational_mapping
뜻 : 객체 관계형 매핑
매핑 :: 연결
즉 객체 관계 연결 이라고 볼 수 있습니다.
객체 그리고 관계형 DB의 데이터 를 연결하는게 목적인데.
https://stackoverflow.com/questions/49475385/diffrence-between-jpa-api-and-hibernate-native-api
JPA라고 이루어진 명세를 구현하는것들 가운데 하나가 Hibernate 이다.
현재 프로젝트에서는 Hiber Native API는 사용하지 않는중
Source :: https://www.baeldung.com/spring-data-query-by-example
@Entity
class Passenger {
@Id
@GeneratedValue
@Column(nullable = false)
private Long id;
@Basic(optional = false)
@Column(nullable = false)
private String firstName;
@Basic(optional = false)
@Column(nullable = false)
private String lastName;
@Basic(optional = false)
@Column(nullable = false)
private int seatNumber;
// constructor, getters etc.
//@basic 생략가능
}
And run Spring, so Created Table and Column@Repository
public interface JpaRepository<T, ID>
extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
}
// PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> 생략가능
public interface QueryByExampleExecutor<T> {
<S extends T> Optional<S> findOne(Example<S> var1);
<S extends T> Iterable<S> findAll(Example<S> var1);
<S extends T> Iterable<S> findAll(Example<S> var1, Sort var2);
<S extends T> Page<S> findAll(Example<S> var1, Pageable var2);
<S extends T> long count(Example<S> var1);
<S extends T> boolean exists(Example<S> var1);
} // 이하 커스텀 메서드 , 쿼리 작성가능 이렇게 분리해도되고
// 직접 리포지토리 내부에 작성해도 됨
기본적인 골자만 먼저 요약설명 후 수정 및 내용추가.
@NoArgsConstructor
@Builder
@ToString
@AllArgsConstructor
@Setter
@Getter
@Entity
@Table(name = "USER_TABLE",uniqueConstraints = {
@UniqueConstraint(columnNames = "email")
})
public class User {
@Id
@GeneratedValue
private Long id;
@Column(nullable = false)
private String password;
@Column(nullable = false)
private String name;
@Column(nullable = false)
private String email;
private String imageUrl;
@Enumerated(EnumType.STRING)
private AuthProvider provider;
private String providerId;
@Temporal(TemporalType.TIMESTAMP)
@CreationTimestamp
@Column(nullable = false)
private java.util.Date createDate; //Timestamp
}
Source :: TravelSite Proj
객체이자 도메인이자 나중에 테이블이 될 것. Entity 어노테이션 상단은 lombok에서 지원
@Data
는 @Getter
, @Setter
, @RequiredArgsConstructor
, @ToString
, @EqualsAndHashCode
를 전부 포함하는 어노테이션인데, 아직 적응이 잘 안되서 본인은 일일히 명시하고 필요할때마다 추가하는걸 선호.(strategy=GenerationType.IDENTITY) IDENTITY = AUTO_INCREMENT
SEQUENCE :: (ORACLE, PostgreSQL, DB2, H2) order by sequence file or table
TABLE :: Like sequence however create key building table (able ALL DB)
AUTO :: auto (DEFAULT)
Column : DB 켜본사람은 전부가 아는 컬럼. 커스텀 이름, nullable 설정 가능 @Table(name = "USER_TABLE",uniqueConstraints = {@UniqueConstraint(columnNames = "email")}) : USER은 예약어라 해당 이름 자체로 테이블 생성불가 그러나 엔티티명은 유저로 유지하고싶을때 DB에는 이름을 바꿔 등록, UK에 email 컬럼 추가.@Repository
public interface UserRepository extends JpaRepository<User,Long> {
@Query(value = "select id from USER where id = : id", nativeQuery = true)
List<User> searchParamRepo(@Param("id") String id);
Optional<User> findByname(String username);
@Query(value =
"SELECT * FROM USER_TABLE" +
"ORDER BY email"
,nativeQuery = true)
List<User> searchByEmail(@Param("email") String email);
Optional<User> findByEmail(String email);
Boolean existsByEmail(String email);
}