inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

자바 ORM 표준 JPA 프로그래밍 - 기본편

영속성 컨텍스트 2

em.persist 관련 질문이 있습니다!

277

코린코린

작성한 질문수 53

0

안녕하세요, 영한님.
항상 좋은 강의 해주셔서 감사합니다.
 
다름이 아니라 em.persist 했을 때 Exception 처리관련 여쭤보고 싶은 것이 있어 글을 적었습니다. 수많은 구글링을 해도 찾을 수가 없어서 지푸라기라도 잡는 심정으로 도움을 요청드립니다 ㅠㅠ..
 
[도메인 Member Entity Unique 제약 조건 설정]
@Column(unique = true)
private String nickname;

 

[em.persist로 유니크 제약조건 테스트]

@Rollback(value = false)
@Test
void 중복이름가입_실패해야함() {

Member newMember1 = Member.createNewMember("abc", "abcd", "abcde", "abcde@naver.com");
Member newMember2 = Member.createNewMember("abc", "abcd", "abcde", "abcde@naver.com");

em.persist(newMember1);

em.flush();
em.clear();

try {
em.persist(newMember2);
} catch (JDBCException e) {
log.info("MYERROR = {}", e.getMessage());
} catch (DbException d) {
log.info("MYERROR = {}", d.getMessage());
} catch (Exception k) {
log.info("MYERROR = {}", k.getMessage());
}

}

다음과 같이 테스트 코드를 작성해서 여러 Exception을 받아보고자 했습니다. 그리고 실행하면 아래와 같이 많은 에러 코드가 발생합니다.

 

1. DbException이 발생해서 Catch했는데 안되네요..

2. ConstraintViolationException이 발생했는데, 이건 JDbcException을 상속받은 Exception이라 JdbException으로 Catch 하려고 했는데 Catch가 안되네요.

혹시 이런 경우에는 em.persist 시 DB 유니크 제약 조건에서 발생하는 문제는 어떻게 예외 처리를 해야할지 알려주실 수 있으실까요?

 

항상 좋은 답변 감사합니다!

좋은 하루 되세요

 

JPA java

답변 2

0

김영한

안녕하세요. 안상혁님

혹시 DB에 이미 데이터가 있는 것은 아닐까요? 그래서 처음부터 오류가 발생하는 것은 아닌지요?

그게 아니라면

전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.

구글 드라이브 업로드 방법은 다음을 참고해주세요.

https://bit.ly/3fX6ygx

 

주의: 업로드시 링크에 있는 권한 문제 꼭 확인해주세요

 

추가로 다음 내용도 코멘트 부탁드립니다.

1. 실행 방법을 알려주세요.

2. 어떻게 문제를 확인할 수 있는지 자세한 설명을 남겨주세요.

감사합니다.

 

0

David

안녕하세요. 안상혁님, 공식 서포터즈 David입니다.

ConstraintViolationException은 DataIntegrityViolationException으로 예외를 잡으실 수 있습니다.

catch 조건을 DataIntegrityViolationException으로 바꿔서 해주세요:)

감사합니다.

0

코린코린

"답변 감사드립니다. 그런데 말씀해주신 것처럼 DataIntegrityViolationException으로 Catch를 잡아도, Exception이 잡히지 않습니다 ㅠㅠ...

 

@Test
@Transactional
void 중복이름가입_실패해야함() {

Member newMember1 = Member.createNewMember("abc", "abcd", "abcde", "abcde@naver.com");
Member newMember2 = Member.createNewMember("abc", "abcd", "abcde", "abcde@naver.com");


em.persist(newMember1);
em.flush();
em.clear();

try {
em.persist(newMember2);
em.flush();
em.clear();
} catch (DataIntegrityViolationException e) {
log.info("MYERROR = {}", e.getMessage());
} catch (DbException d) {
log.info("MYERROR = {}", d.getMessage());
} catch (ConstraintViolationException e) {
log.info("MYERROR = {}", e.getMessage());
}

}

다음과 같이 코드를 작성했습니다.

em.persist(newMember2)를 하고 em.flush()로 DB에 밀어넣는 순간 유니크 제약 조건 확인할 것으로 예상했기 때문에 Try 안에 이렇게 넣었고... Catch로 잡을 수 있을 것이라 생각했는데... 안 잡히고 다음과 같이 에러 메세지가 발생합니다 ㅠㅠ..

 

혹시 다른 방법을 좀 더 시도해볼만한 것은 없을까요...??

 

Caused by: org.hibernate.exception.ConstraintViolationException: could not execute statement

at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:59)

at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:37)

at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113)

at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:99)

at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:200)

at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:46)

at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3375)

at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3908)

at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:107)

at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:604)

at org.hibernate.engine.spi.ActionQueue.lambda$executeActions$1(ActionQueue.java:478)

at java.base/java.util.LinkedHashMap.forEach(LinkedHashMap.java:684)

at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:475)

at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:344)

at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:40)

at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:107)

at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1402)

... 77 more

Caused by: org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: Unique index or primary key violation: "PUBLIC.UK_IM48PNV02C18VQLPRLYQC0UAR_INDEX_8 ON PUBLIC.MEMBER(JOIN_ID) VALUES 1"; SQL statement:

insert into member (created_time, last_modified_time, email, join_id, nickname, password, member_id) values (?, ?, ?, ?, ?, ?, ?) [23505-200]

at org.h2.message.DbException.getJdbcSQLException(DbException.java:459)

at org.h2.message.DbException.getJdbcSQLException(DbException.java:429)

at org.h2.message.DbException.get(DbException.java:205)

at org.h2.message.DbException.get(DbException.java:181)

at org.h2.index.BaseIndex.getDuplicateKeyException(BaseIndex.java:103)

at org.h2.mvstore.db.MVSecondaryIndex.checkUnique(MVSecondaryIndex.java:221)

at org.h2.mvstore.db.MVSecondaryIndex.add(MVSecondaryIndex.java:196)

at org.h2.mvstore.db.MVTable.addRow(MVTable.java:531)

at org.h2.command.dml.Insert.insertRows(Insert.java:195)

at org.h2.command.dml.Insert.update(Insert.java:151)

at org.h2.command.CommandContainer.update(CommandContainer.java:198)

at org.h2.command.Command.executeUpdate(Command.java:251)

at org.h2.server.TcpServerThread.process(TcpServerThread.java:406)

at org.h2.server.TcpServerThread.run(TcpServerThread.java:183)

at java.base/java.lang.Thread.run(Thread.java:833)

벌크연산에서 member.getAge 호출 시 영속성 컨텍스트에서 데이터를 가져오는건가요?

0

54

2

inheritance startegy 선택시 고려사항

0

36

1

Entity 동등성 비교

0

38

1

실무 조언 관련 질문입니다.

0

64

1

H2데이터베이스 파일 생성

0

76

2

서브쿼리 강의에서 ALL 예시 관련 질문드립니다.

0

66

2

수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?

0

62

1

JPQL 메소드와 락

0

62

1

Delivery @OneToOne

0

70

1

17강 4~5분대 테이블 값 조회가 안됩니다.

0

104

2

UnsupportedOperationException 발생

0

97

3

H2 Database 연결이 안됩니다.

0

101

2

연관관계 매핑 질문드립니다.

0

93

2

h2데이터베이스 실행오류

0

114

2

persistence.xml

0

119

2

양방향 연관관계에서 연관관계의 주인(mappedBy)을 왜 꼭 정해야 하나요?

0

87

1

영속성 컨텍스트

0

74

1

JPA 프록시

0

105

1

Native Query와 MyBatis

0

81

1

영속성 컨텍스트는 어떤 메모리에 저장되는건가요?

0

97

1

임베디드 타입 예시 코드 관련 질문

0

125

3

명시적 조인에서 별칭을 주면 왜 객체에 접근할 수 있나요

0

100

3

인텔리제이 패키지 커서 단축키 질문

0

112

2

혹시 현재는 ID 데이터 타입이 String이면 안되나요?

0

151

1