1. 엔티티 Member
지금 우리가 사용하는 테이블에는 없는 테이블이다.
그럴떄 엔티티로 만들어주면 자동으로 DB에 생성된다.
1-1 DML은 commit하지 않으면 rollback되지만 DDL은 autocommit 구문이기 떄문에 별돌의 commit없어도 생성되어 반영된다.
생성 된 자료형은 java object 의 자료형을 따르며 크기를 따로 성정하지 않을 경우 숫자는 nulber(10,0), 문자열은 carchar2(255 char) 로 설정 된다. 생성 되는 컬럼의 순서는 pk가 우선이며, 일반 컬럼은 유니코드 오름차순으로 생성 된다.
2.컬럼
컬럼별로 할 수 있는 설정값들이 있음을 기억하고 유의하자.
@Column(name="MEMBER_PWD")
private String memberPwd;
@Column(name="NICKNAME")
@Transient /*테이블로 크리에이트 할때 필드에서 이 어노테이션이 붙은 컬럼은 제외하겠다.*/
private String nickname;
@Transient 테이블로 크레이트할때 필드에서 이 어노테이션 붙은 컬럼은 제외하겠다.
1.@name : 필드와 매핑할 테이블의 컬럼 이름
2. insertable : 엔티티 저장 시 이 필드도 같이 저장(true 기본값)
3. updatable : 엔티티 수정 시 이 플드도 같이 수정(true 기본값)
4. table : 하나의 엔티티를 두 개 이상의 테이블에 매핑할 때 사용(현재 클래스가 매핑된 테이블)
5. nullable : null값 허용 여부 설정. not null 제약조건에 해당함 (true 기본값)
6. unique : 한 컬럼에 unique 제약조건을 설정.
(기본값은 없으며, 두 개 이상 컬럼에 unique 제약조건을 설정하기 위해서는 클래스 레벨에서 @Table의 uniqueConstraints 속성에 설정한다.)
7. columnDefinition : 데이터베이스 컬럼 정보를 직접 기입 (필드의 자바 타입과 방언 정보를 사용해서 적절한 컬럼 타입을 생성함)
8. length : 문자 길에 제약조건, String 타입에서만 사용(255 기본값)
*주로 name과 nullable을 사용하며, insertable과 updateable은 정보를 읽기만 하고 실수로 변경하게 될 것을 미연에 방지하고자 설정한다.
*다만 애플리케이션 레벨에서 DDL 구분을 직접 사용하지 않는 것이 더 바람직하다.
ex)
/*보통 가입일 할때 사용한데 그래서 인서트 될때 그 시간을 확인하는 것*/
@Column(name="ENROLL_DATE")
//@Temporal(TemporalType.TIMESTAMP) //DATE + TIME 으로 날짜 및 시간이 나온다. //날짜에 대해서 어떻게 다루고 싶은지 조절할 수 있음.
//@Temporal(TemporalType.DATE) //ORACLE에서는 TIMESTAMP와 차이가 없다. (오라클은 요로케만 해도 된다는 거지)
@Temporal(TemporalType.TIME) //시간만 다루기 원한다는 뜻으로 1970/01/01에 현재 시간만 맞게 나온다.
private Date enrollDate; //Temporal 위해서는 java sql.date이 아닌 util.date로 해야한다. 왜 이걸로 해야하는지 질문! 차이가 없다며..
//DATE안에 local..어쩌고도 있고 DATE안에 자체에는 메소드가 있군..
자바 유틸로 사용할 경우는 반드시 저렇게 설정을 요한다.
하지만 sql 유틸을 사용할 때에는 상관없다. (* 이부분 체크한번 해야함)
3.PK (프라이머리키)
3-1 시퀀스
@Entity(name="sequence_member")
@Table(name="TBL_MEMBER_SECTION03_SUBSECTION01")/*지금 우리가 사용하는 테이블에는 greedy에 없다. 그러면 자동으로 생성해준다. 이게 DML 인듯 한데 */
@SequenceGenerator(
name="MEMBER_SEQUENCE_GENERATOR",//식별자 생성기 이름
sequenceName="SEQ_MEMBER_NO", //데이터베이스에 등록 되어있는 시퀀스 이름
initialValue=5, //시퀀스의 시작값 설정
allocationSize=50
//기본 값이 50으로 설정 되어 있고 시퀀스 증가와 별개로 메모리에서 식별자를 할당하여 매번 시퀀스를 호출하지 않도록 하는 성능 최적화를 위해 설정 된 값이다.
//여러 요청이 동시에 접근해서 데이터를 등록할 때 기본 값이 충돌하지 않는 장점(동시성 문제 해결)이 있지만, 시퀀스가 한 번에 많이 증가하는 점을 염두에 두어야 한다.
)
public class Member {
@Id
@Column(name="MEMBER_NO")
@GeneratedValue(strategy= GenerationType.SEQUENCE, generator="MEMBER_SEQUENCE_GENERATOR" ) /*타입은 각자가 쓰는 툴 목적에 따라 설정한다. GenerationType.SEQUENCE */
private int memberNo;
3-1-1 시퀀스 제너레이터(오라클 데이터베이스에서만 제공하는 기능)
:데이터베이스 시퀀스를 사용해서 기본 키를 할당한다.
@SequenceGenerator(
name="MEMBER_SEQUENCE_GENERATOR",//식별자 생성기 이름
sequenceName="SEQ_MEMBER_NO", //데이터베이스에 등록 되어있는 시퀀스 이름
initialValue=5, //시퀀스의 시작값 설정
allocationSize=50
//기본 값이 50으로 설정 되어 있고 시퀀스 증가와 별개로 메모리에서 식별자를 할당하여 매번 시퀀스를 호출하지 않도록 하는 성능 최적화를 위해 설정 된 값이다.
//여러 요청이 동시에 접근해서 데이터를 등록할 때 기본 값이 충돌하지 않는 장점(동시성 문제 해결)이 있지만, 시퀀스가 한 번에 많이 증가하는 점을 염두에 두어야 한다.
@Id
@Column(name="MEMBER_NO")
@GeneratedValue(strategy= GenerationType.SEQUENCE, generator="MEMBER_SEQUENCE_GENERATOR" ) /*타입은 각자가 쓰는 툴 목적에 따라 설정한다. GenerationType.SEQUENCE */
private int memberNo;
3-1-2 테이블 제너레이터(오라클 데이터베이스에서만 제공하는 기능)
:키 생성 테이블을 사용한다.(키 생성 테이블을 생성하고 @GeneratedValue를 table로 준다.
@TableGenerator(
name="MEMBER_SEQ_TABLE_GENERATOR",
table="TBL_MY_SEQUENCES",
pkColumnValue="MY_SEQ_MEMBER_NO", //pk 컬럼의 이름 지정
//pkColumName:시퀀스 컬러명(기본 값은 SEQUENCE_NAME)
//valueColumnName :시퀀스 값 컬럼명(기본 값은 NEXT_VAL)
allocationSize=1
)
오라클에 가보면 TBL_MY_SEQUENCES
라는 테이블이 생성되어 있다. 컬럼에 대해서 별도로 설정하지 않을 경우 기본값이 들어가서 생성된다.
(? 테이블을 사용한 데이터베이스를 한번 보고 싶다. 왜 그렇게 했는지도 궁금하고 물론 MYSQL 오라클 둘다 공용적으로 사용가능하니까 그렇겠지?)