인프런 커뮤니티 질문&답변
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
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님.
우선 test2를 test로 변경하고 테스트를 진행해보시겠어요?
그렇게 수정한 다음 hello2를 이용해서 정상적으로 테스트를 통과하는지 살펴보시기 바랍니다.
그 테스트에서 문제가 없다면 나머지 설정은 고려하지 않아도 되며,
test2 데이터베이스에만 문제를 집중할 수 있을것 같습니다.
.
문제가 꼭 해결되기를 바랍니다.
감사합니다.