인프런 커뮤니티 질문&답변

ksh9241님의 프로필 이미지
ksh9241

작성한 질문수

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

필드와 컬럼 매핑

javax.persistence.RollbackException에 대해서

작성

·

366

0

안녕하세요.
한시간의 삽질동안 문제점을 발견하였습니다. 로직에서 보이는 바와 같이 persistence.xml에서 unit을 하나 더 만들고 url역시 새로 만들어주고 unit명도 새로 만들었습니다. 두개의 설정은 복붙을 하였기 때문에 문제가 없는 줄 알았지만 unit hello로 EntityManagerFactory.Persistence.createEntity....("hello") 일땐 정상 작동되며 hello2일땐 RollbackException이 발생하는 이유를 찾지 못했습니다. 답을 꼭좀 알려주시면 감사하겠습니다.

<?xml version="1.0" encoding="UTF-8"?> 

<!-- JPA Version -->

<persistence version="2.2" 

 xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd"> 

<persistence-unit name="hello"> <!-- <- JPA이름 ( DataBase당 하나정도 만듦 ) -->

<properties> 

<!-- 필수 속성(DataBase 접근 정보) --> 

<!-- javax : 다른 jpa구현 라이브러리를 사용해도 그대로 사용 가능(표준)

  hibernate : hibernate에서만 사용가능(전용) -->

<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/> 

<property name="javax.persistence.jdbc.user" value="sa"/> 

<property name="javax.persistence.jdbc.password" value=""/> 

<property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test"/> 

<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/> 

<!-- *중요  ~~~.dialect = 데이터베이스 방언 (즉, 특정 DB만의 고유한 함수를 변환해주는 속성)

- JPA는 특정 데이터베이스에 종속 X

ex) mysql -> oracleDB 변경 시 문제없어야 함.

- 각각의 데이터베이스가 제공하는 SQL 문법과 함수는 조금씩 다름

가변 문자 : MySQL은 VARCHAR, ORACLE은 VARCHAR2

문자열을 자르는 함수 : SQL 표준은 SUBSTRING(), ORACLE은 SUBSTR()

페이징 : MySQL은 LIMIT, Oracle은 ROWNUM

방언 : SQL 표준을 지키지 않은 특정 데이터베이스만의 고유한 기능

   *-->

 

<!-- 옵션 --> 

<property name="hibernate.show_sql" value="true"/> <!-- 쿼리 나가는거 볼지 말지 설정하는 것 -->

<property name="hibernate.format_sql" value="true"/> <!-- 쿼리를 가독성 좋게 정리할 것인지 -->

<property name="hibernate.use_sql_comments" value="true"/> <!-- 어떠한 상황에서 쿼리가 나온지(제목같은 느낌) -->

<property name="hibernate.jdbc.batch_size" value="10"/> <!-- 사이즈 크기만큼 모아서 데이터베이스에  한번에 네트워크로 쿼리를 보낸 후 DB Commit을 한다. -->

<property name="hibernate.hbm2ddl.auto" value="update" /> 

<!-- 

  create : 기존 테이블 삭제 후 다시 생성(Drop + Create) 

  create-drop : create와 같으나 종료시점에 테이블 Drop (테스트케이스 같은 곳에서 사용 후 삭제처리)

  update : 변경분만 반영(운영 DB에는 사용하면 안됨) 

  validate : 엔티티와 테이블이 정상 매핑되었는지만 확인

  none : 사용하지 않음

-->

</properties> 

</persistence-unit> 

<persistence-unit name="hello2">

<properties>

<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/> 

<property name="javax.persistence.jdbc.user" value="sa"/> 

<property name="javax.persistence.jdbc.password" value=""/> 

<property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test2"/> 

<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/> 

 

<!-- 옵션 --> 

<property name="hibernate.show_sql" value="true"/> <!-- 쿼리 나가는거 볼지 말지 설정하는 것 -->

<property name="hibernate.format_sql" value="true"/> <!-- 쿼리를 가독성 좋게 정리할 것인지 -->

<property name="hibernate.use_sql_comments" value="true"/> <!-- 어떠한 상황에서 쿼리가 나온지(제목같은 느낌) -->

<property name="hibernate.jdbc.batch_size" value="10"/> <!-- 사이즈 크기만큼 모아서 데이터베이스에  한번에 네트워크로 쿼리를 보낸 후 DB Commit을 한다. -->

<!-- <property name="hibernate.hbm2ddl.auto" value="none" />  -->

</properties>

</persistence-unit>

 

</persistence>

답변 2

1

ksh9241님의 프로필 이미지
ksh9241
질문자

h2에서 Embedded에서  test2를 만들어서 진행해보았고 기존에 있던 세팅 그대로도 진행하였지만 처리되지않았습니다. 다시 시도해보고 안되면 댓글달도록 하겠습니다. 답변 감사드립니다.

- 추가 : 저번에 문의드린부분 주석해제 후 실행해봤는데 정상작동하였습니다. 확실하지 않은 문제에 질문을 드려 죄송합니다 -

안녕하세요! ksh9241님.

우선 test2를 test로 변경하고 테스트를 진행해보시겠어요?

그렇게 수정한 다음 hello2를 이용해서 정상적으로 테스트를 통과하는지 살펴보시기 바랍니다.

그 테스트에서 문제가 없다면 나머지 설정은 고려하지 않아도 되며,

test2 데이터베이스에만 문제를 집중할 수 있을것 같습니다.

.

문제가 꼭 해결되기를 바랍니다.

감사합니다.

ksh9241님의 프로필 이미지
ksh9241
질문자

답변감사합니다. 로컬에서 test2생성된 거 확인하고 실행하였더니 정상작동되었습니다. 도움주셔서 감사합니다. ㅎ

0

안녕하세요 ksh9241님!

.

설정파일을 살펴보니 이런 부분이 있습니다.

<property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test2"/>

.

.

jdbc:h2:tcp://localhost/~/test2 부분에서

test2 라는 데이터베이스가 생성되어 있지 않아 생기는 문제입니다.

JPA는 테이블에 대한 관리는 가능하지만, 데이터베이스 레벨을 생성하거나 삭제하지는 못합니다.

H2 데이터베이스 콘솔에 접속하셔서 'test2'라는 데이터베이스를 직접 생성해주셔야 합니다.

.

test2 데이터베이스를 생성하시는 방법은

test를 생성하셨던 강의의 내용을 다시 반복하시면 됩니다.

로컬호스트로 접속하셔서 파일생성 이후 tcp로 바꾸어서 접속 하는 과정을 반복하시면 됩니다.

.

감사합니다.

ksh9241님의 프로필 이미지
ksh9241

작성한 질문수

질문하기