작성
·
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
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 데이터베이스에만 문제를 집중할 수 있을것 같습니다.
.
문제가 꼭 해결되기를 바랍니다.
감사합니다.