강의

멘토링

로드맵

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

ksh9241님의 프로필 이미지
ksh9241

작성한 질문수

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

필드와 컬럼 매핑

javax.persistence.RollbackException에 대해서

작성

·

496

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>

퀴즈

Khi sử dụng annotation `@Entity` để ánh xạ một lớp thành entity trong JPA, những điều kiện quan trọng mà lớp đó phải đáp ứng về cơ bản là gì?

Mọi trường phải là public

phải là lớp final

Hàm tạo mặc định phải public hoặc protected

Phải bao gồm ít nhất một phương thức static

답변 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

작성한 질문수

질문하기