월 16,940원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
@EmbeddedId로 식별관계를 구성할때 이상한점을 발견했습니다
안녕하세요. JPA강의와 함께 영한님의 JPA프로그래밍책에 예제를 공부 하던중에 @EmbeddedId로 식별관계를 구성할때 이상한점을 발견했습니다부모 : item, 자식 : book , 손자: sciencebook이라는 entity를 만들었을때 손자 엔티티에서 아래와 같이 referencedColumnName 을 설정하지 않으면@JoinColumns({@JoinColumn(name = "ITEM_ID"), @JoinColumn(name = "BOOK_ID")})데이터베이스에 아래와 같이 ITEM_ID 컬럼과 BOOK_ID 컬럼이 반대로 저장되는 것입니다.아래 처럼 쿼리도 이상합니다.Hibernate: alter table ScienceBook add constraint FKlpf2m8vqpl0b7vmopmnvgphg2 foreign key (ITEM_ID, BOOK_ID) references Book (BOOK_ID, ITEM_ID)referencedColumnName를 설정하면 정확하게 데이터베이스에 저장되지만 왜 이런 결과가 나오는지 이유를 알수 없어서 질문올립니다. 좋은 강의 감사드립니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
영한님 연관관계의 주인 개념과 관련해서 질문이 있습니다!
영한님 먼저 좋은 강의 제공해주셔서 정말 감사드린단 말씀 드리고 싶습니다. 이 강의는 1강이지만 이후 강의를 보면서도 계속 돌아오는 곳이네요. 제가 여쭤보고 싶은 것은 다음과 같습니다.객체와 데이터베이스 테이블간의 패러다임 차이를 설명하시면서 말씀하신 ‘룰’이라는 것(연관관계의 주인과 mappedby)이 에러를 수반하는 강제된 제약인 줄 알았는데 양방향 업데이트가 가능한 엔티티 설계가 기술적으로 가능하다는 것을 알게 된 후 여러 궁금증이 생겼습니다. 베스트 프랙티스는 아니겠지만요// Team @OneToMany @JoinColumn(name = "team_id") private List<Member> members = new ArrayList<>(); // Member @ManyToOne private Team team; // Test ... teamA.getMembers().add(member1); member2.setTeam(teamB);제 질문의 주 요지는 JPA 양방향 연관관계에서 관계의 주인이란 개념은 JPA 설계 사상과(객체지향쪽으로 패러다임 일치를 지향) 상태를 가진 ORM인 JPA에서 양쪽에 값을 채우고 반영될 수 있을 때의 혼란과 사이드 이펙트를 고려한, 기술적이라기보단 개발자(혹은 JPA)의 자의적인 제한일까 하는 것입니다.타언어에서 다른 ORM을 쓰다가 넘어왔는데 머리를 비우기가 참 어렵네요😂
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
영속성 컨텍스트 초기화 후 저장
안녕하세요 선생님! 위 사진처럼 영속성 컨텍스트를 초기화 후 1차 캐시에 없는 team 엔티티를 user 엔티티의 manyToOne 으로 하여 저장할 때 왜 저장이 되는지 궁금합니다.제가 생각한 바로는 team 엔티티가 영속성 컨텍스트에 로드되어 있지 않기 때문에 에러가 나야한다고 생가하는데 정상적이게 insert 쿼리가 2번 발생합니다.식별자, 준영속과 관련있는 내용일까요?또한 위의 team 처럼 저장 후 영속성 컨텍스트가 초기화 되면 준영속 상태가 되나요?감사합니다!
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
@OneToOne에서 즉시로딩만 되요
제가 두 테이블을 1대1 관계로 양방향을 설정했는데mappedby 처리된 부분에서 계속 즉시 로딩이 되는데 어떻게 해결방법이 없나요?Lazy 처리해도 즉시로딩이 되네요
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
EntityExsistsException
em.pesist() 를 사용하여 insert 문을 실행코자 합니다. 아래 코드와 같이 insert 를 2번 이상 실행키려고 합니다. Minfo m1 = new Minfo();em.persist(m1);Minfo m2 = new Minfo();em.persist(m2);Minfo 객체가 m1 하나만 persist() 하는 경우 에러가 발생하지 않지만, m1, m2 를 둘 다 persist() 하려는 경우, EntityExsistsException 를 발생시킵니다.A different object with same identifier value was already associated with the session 메시지가 뜹니다. 강의 예제에서 Member member 객체를 여러개 생성하여 em.persist(member) 가 되는 것을 확인하였는데, 되지 않는 이유를 모르겠습니다. Minfo2 vo클래스를 하나 더 만들어서 아래와 같이 실행하면 문제가 되지는 않습니다만,Minfo m1 = new Minfo();em.persist(m1);Minfo2 m2 = new Minfo2();em.persist(m2);insert 갯수가 불규칙한 다중 insert 를 처리할 경우, vo 를 매번 만들 수도 없어서 고민입니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
복잡한 데이터의 처리에서의 연관관계와 데이터 핸들링
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요. 작년에 수강했다가, 재수강(?)했습니다. fe 몇개월하다보니 jpa가 초기화 된 상태로 프로젝트에 투입되어 정신차려보니 설계가 엉망인것 같아서 고견을 여쭙고자 질의 드립니다. 현재 개발중인 업무의 프로세스는 외부 api의 복잡한 데이터를 끌고와 데이터 그대로 저장하고나서, 필요한 데이터를 가공하여 유의미한 데이터만을 모아둔 테이블에 저장하는 것을 batch를 사용하여 개발했습니다. (정상동작은 하는데 설계부분이 꼼수개발) 저는 모든 연관관계상의 엔티티에 cascade.All 옵션을 주고, 엔티티 관계는 일대다단방향으로 하고, 자식과 손자는 IdClass를 가지고 primary key 를 관리하여, 한번에 저장하는 형식으로 개발하였습니다. ( dto - entity converting 은 mastruct를 사용하여 한번에 변환) 해당 데이터의 id도 모두 외부에서 전달되어지는 형태입니다. 질문) 김영한님이라면 어떤 전략을 취하셨을 까요? 외부에서 들어오는 데이터는 아래와 같습니다. 실제 데이터와는 다르게 단순화했고, 해당 데이터가 50~100건 정도 한번에 들어오고, 1~3분에 한번정도 수행(거의 실시간데이터)하려고 하고 있습니다. (총 데이터 row 부모기준 300이하) --테이블상관계 부모- 자식 (1-N) 자식-손자 (1-N) 항상 진심과 성심이 느껴지는 좋은 강의를 공유해 주셔서 감사합니다! { "id": "1", "children": [ { "uid": "3256", "child_id": "1", "grand_children": [ { "id": "1", "type": "TypeX", "neighborhood_ids": [ "11" ], "last_updated": "2022-03-16T10:10:02Z" }, { "id": "2", "type": "AC_2_PHASE", "neighborhood_ids": [ "13" ], "last_updated": "2022-03-18T08:12:01Z" } ], "last_updated": "2022-06-28T08:12:01Z" }, { "uid": "3257", "child_id": "2", "grand_children": [ { "id": "1", "type": "TypeX", "neighborhood_ids": [ "12" ], "last_updated": "2022-06-29T20:39:09Z" } ], "last_updated": "2022-06-29T20:39:09Z" } ], "time_zone": "Asia/Seoul", "last_updated": "2022-06-29T20:39:09Z" }
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
Category의 parent_id 제가 이해한 게 맞을까요?
아래쪽에 다른 분이 질문하신 것도 봤는데.. 여튼 Category 클래스 안에서 Category형 변수를 생성, 그러니까 자기 자신을 호출하는 셈이므로 이는 self join이고, 이 self join의 키는 @JoinColumn에서 내가 지정한 "PARENT_ID" 라는 이름으로 저장된다 정도가 제가 이해한 것 같습니다. 혹시 제가 잘못 알고 있거나, 뭔가 추가적으로 알아둬야 할 것이 있을까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
@GeneratedValue(strategy = GenerationType.IDENTITY)
id 값은 String 으로 하면 오류가 생기고 long 타입으로 하면 실행이 됩니다. 찾아보니 h2 버전 문제라는 부분도 있어서 버전도 1.4.200으로 바꾸기도 했는데요 그래도 String 타입은 안돼서 그냥 long 타입으로 써야 할까하는데 괜찮을까요? 그리고 버전은 1.4.200을 그대로 사용해도 될까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
@Column 어노테이션에 관하여
컬럼 어노테이션은 여러번 사용 할 수 있는 건가요? 예를들어 @Column(name = "Nick_name") private String name; @Column(name = "Adress") private String addr; 이런식으로 여러개 컬럼으로 각 필드마다 매핑을 해주어야 하나요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
양방향 연관관계에 대한 질문입니다.
안녕하세요 영한님 양방향 연관관계에대하여 질문있어서 글 남깁니다! 질문1. 양방향 연관관계를 최대한 쓰지 않아야 하는 이유중 하나가 A,B 엔티티가 있고, 양방향 연관관계를 통해 A엔티티에서 B엔티티의 리스트를 가지고 있어야하는 상황에서, A엔티티 가 가지고 있는 B엔티티 데이터의 리스트 원소 갯수가 엄청나게 많아질 경우 그 리스트를 담고있어야할JVM 메모리에 부담이 될 수 있는 위험성 때문이라고 생각했는데 이에 대한 피드백 부탁드립니다! 질문 2. 양방향 연관관계를 굳이 맺어야하는 이유가 잘 와닿지 않습니다. 강의 예시에서 해당 Team 의 Member 들을 알고 싶기 때문에 양방향 관계를 맺는 데 , 해당 Team 의 Member 들을 알고 싶으면 Member 도메인의 컨트롤러에서 호출 하는게 이점이 더 있지 않을까 하여 질문드립니다. 결론은 제가 생각하기에 단방향 관계로 다 설계 할 수 있을거같아서 , 양방향 관계가 실제 실무에서 쓰이게 된다면, 어떤 상황과 이유에서 쓰이는지 궁금합니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
엔티티 정의시 기본키(복합키) 질문 있습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]강의 들은 내용을 기반으로 사이드 프로젝트 진행중인데 엔티티 정의 중에 문의사항이 있습니다. A라는 테이블이 있고, B는 A의 이력테이블입니다. A테이블의 기본키를 a_id라고 할 때, B테이블의 기본키는 (a_id+b_date) 이렇게 복합키로 하려고 하는데요. 1. 외래키가 기본키가 되는것인데 아래처럼 하면될까요? @Id@ManyToOne(fetch = FetchType.LAZY)@JoinColumn(name = "A_ID")private A aId;2. (외래키+추가필드)로 표현되는 기본키는 어떻게 표현해야할까요?인터넷을 찾아보고, 강의도 다시 리뷰해보았는데 확실한해답을 못찾겠네요. 도움부탁드립니다 ㅜㅠ.ㅜ
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
@AttributeOverrides 사용?
한 엔티티에서 값은 값 타입 사용 시 @AttributeOverrides를 사용하지 않고 아래와 같이 아예 새로 생성해서 사용하는건 좋지 않은 방법인지 궁금합니다!! @Embedded private HomeAddress homeAddress; @Embedded private WorkAddress workAdress;
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
main 오류 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요 Main 메소드 실행시 오류가 발생해서 질문드립니다. <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.1</version> </dependency> 이거 추가해주면 해결된다고 해서 일단 추가한 후 실행 해봤는데도 계속 오류가 발생하는데 해결법이 있을까요? ERROR: Connection is broken: "java.net.SocketTimeoutException: connect timed out: localhost" [90067-199] Exception in thread "main" org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:275) at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:237) at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) at org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.injectServices(DefaultIdentifierGeneratorFactory.java:152) at org.hibernate.service.internal.AbstractServiceRegistryImpl.injectDependencies(AbstractServiceRegistryImpl.java:286) at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:243) at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.<init>(InFlightMetadataCollectorImpl.java:179) at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:119) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:904) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:935) at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:56) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54) at hellojpa.JpaMain.main(JpaMain.java:8) Caused by: org.hibernate.exception.JDBCConnectionException: Error calling Driver#connect at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:48) at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113) at org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator.convertSqlException(BasicConnectionCreator.java:118) at org.hibernate.engine.jdbc.connections.internal.DriverConnectionCreator.makeConnection(DriverConnectionCreator.java:41) at org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator.createConnection(BasicConnectionCreator.java:58) at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections.addConnections(DriverManagerConnectionProviderImpl.java:363) at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections.<init>(DriverManagerConnectionProviderImpl.java:282) at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections.<init>(DriverManagerConnectionProviderImpl.java:260) at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections$Builder.build(DriverManagerConnectionProviderImpl.java:401) at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.buildPool(DriverManagerConnectionProviderImpl.java:112) at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.configure(DriverManagerConnectionProviderImpl.java:75) at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:100) at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:246) at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.buildJdbcConnectionAccess(JdbcEnvironmentInitiator.java:145) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:66) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35) at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:94) at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) ... 14 more Caused by: org.h2.jdbc.JdbcSQLNonTransientConnectionException: Connection is broken: "java.net.SocketTimeoutException: connect timed out: localhost" [90067-199] at org.h2.message.DbException.getJdbcSQLException(DbException.java:617) at org.h2.message.DbException.getJdbcSQLException(DbException.java:427) at org.h2.message.DbException.get(DbException.java:194) at org.h2.engine.SessionRemote.connectServer(SessionRemote.java:435) at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:317) at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:169) at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:148) at org.h2.Driver.connect(Driver.java:69) at org.hibernate.engine.jdbc.connections.internal.DriverConnectionCreator.makeConnection(DriverConnectionCreator.java:38) ... 29 more Caused by: java.net.SocketTimeoutException: connect timed out at java.base/java.net.PlainSocketImpl.waitForConnect(Native Method) at java.base/java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:107) at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:412) at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:255) at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:237) at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) at java.base/java.net.Socket.connect(Socket.java:608) at org.h2.util.NetUtils.createSocket(NetUtils.java:103) at org.h2.util.NetUtils.createSocket(NetUtils.java:83) at org.h2.engine.SessionRemote.initTransfer(SessionRemote.java:115) at org.h2.engine.SessionRemote.connectServer(SessionRemote.java:431) ... 34 more Process finished with exit code 1 pom.xml persistence.xml 은 자료랑 똑같이 작성했습니다.
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
동일 호스트에 2개의 스키마를 사용하는 경우
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]jpa에서 db 호스트는 같고 같은 호스트 내 2개의 스키마를사용할때 실무에서 보통 어떤식으로 처리하나요? 1. 데이터소스를 2개로 나눠서 JPA 수동설정으로 관리 -> (https://www.baeldung.com/spring-data-jpa-multiple-databases) 2. 데이터소스에 기본스키마 설정후 다른 스키마 사용하는 엔티티에 @Table 애노테이션에 스키마 속성 표기 -> @Table(name="test" schema[or catalog] = "db1") 3. 기타 현재 1,2번 스키마가 있고 1번이 주로 사용하는 DB 2번 DB는 단순조회용으로 자주는 사용하지는 않는 스키마입니다. 어떤 방법이 보편적인 방식인지 궁금합니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
persistence.xml 질문입니다.
새로운 프로젝트를 만들어서 다시 해보니까 h2.Driver가 오류로 뜹니다 이유가 뭘까요??
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
table 생성 관련
강의대로 똑같이 따라했는데, 테이블이 사진처럼 item, orderitem 두가지 밖에 생기지 않습니다. 혹시 제가 어디 잘못 작성한 것이 있는지 알 수 있을까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
하이버네이트 버전 찾을 수 없다고 합니다.
5.3.10.final 버전은 찾을 수 없다고 하는데 6.1.2.Final 버전을 사용해도 될까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
em.close()를 했음에도 불구하고, could not initialize proxy에러가 발생하지 않습니다.
환경 hibernate:5.4.13.Final h2:1.4.200 ==코드== public class JpaMain { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin(); try { Member member = new Member(); member.setName("kim"); em.persist(member); em.flush(); em.clear(); Member findMember = em.getReference(Member.class, member.getId()); em.close(); findMember.getName(); tx.commit(); } catch (Exception e) { e.printStackTrace(); tx.rollback(); }finally { em.close(); } emf.close(); }} ==코드== 첨부사진 select 쿼리가 나가지 않아야하는데 쿼리가 나가는 이유가 무엇인지 궁금합니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
기존 시퀀스를 사용할 경우
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]hibernate의 ddl 생성 기능을 사용하는것이 아닌, 기존 ddl을 사용한다고 가정할 때, 이미 사용중이던 sequence가 존재할 수 있습니다. JPA에서 매핑한 엔티티가 기존 시퀀스를 사용한다고 가정할 때, 기존 시퀀스와 매핑하는 방법은 알아보았습니다. 하지만, 기존 시퀀스의 increment Size가 N일 때, WAS에서 allocationSize을 N과 같이하지 않으면 WAS 기동시 (PersistenceUnit으로부터 emf 생성시) 매핑 이슈가 발생했습니다. Caused by: org.hibernate.MappingException: The increment size of the [SOMESEQUENCE] sequence is set to [5] in the entity mapping while the associated database sequence increment size is [10]. 여기서 SOMESEQUENCE는 제가 임의로 H2에 미리 만들어둔 시퀀스명이며, INCREMENT SIZE는 10 입니다. 그리고 WAS의 설정은 다음과 같습니다. @SequenceGenerator( name = "BOARD_SEQ_GENERATOR", sequenceName = "SOMESEQUENCE", allocationSize = 5 ) 둘을 같게하면 사용하는것에 문제는 없으나 질문은 다음과 같습니다. 사내에서 JPA를 사용할 때, 어떤 A 개발자가 미리 시퀀스를 만들어뒀으며, 시퀀스가 2부터 2씩 증가하며, 반드시 이 시퀀스를 사용하는 column은 짝수 이도록 하려고 의도했습니다. (incrementSize = 2) 2 -> 4 -> 6 -> 8 -> ... allocationSIze가 2일 때, WAS에선 2번에 한번씩만 ID를 얻기위해 DB에 질의를 수행할 테지만, 문제는 2 -> 4 -> 6 -> 8이 아닌, (query)2 -> 3 -> (query)4 - >5 -> (query)6 으로 ID를 세팅 할 것입니다. 이는 기존에 allocationSize를 사용하며 allocationSIze가 50이며 initial Value가 1일 때, 1->2->3 -> was 종료 -> was 재기동 -> 51 -> 52 ... 와 같은 현상에서 중간에 값이 빠지는것과는 다른 문제입니다. 이 경우엔 unique하다는 점은 유지됩니다. 그렇지만 위의 A 개발자가 미리 만들어 놓은 시퀀스는 시퀀스에 비즈니스 로직인 (짝수여야 한다) 라는 컨셉이 allocationSize를 사용하면 유지되지 못합니다. 또한, allocationSize가 1일때와 그렇지 않을 때가, 다른 양상을 보입니다. 실제 DB의 시퀀스 increment Size가 N일때, allocationSize는 1또는 N만 매핑되는것을 확인 했습니다. 따라서, N/2나 여타 1 < x < N 인 값들에 대해선 allocationSize에 할당할 수 없으므로, increment Size와 allocationSize를 정확히 일치시키거나, 1로 설정하여 매번 시퀀스에 질의하는 방법, 이 둘 외에는 allocationSize를 활용할 방법이 없다고 사료됩니다. 따라서 위와 같은 상황 (A 개발자가 미리 만들어둔 시퀀스를 사용해야 하는 상황) 에는 allocationSize = 1 외에는 방법이 없는것인지 질문드립니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
JPA가 결국엔 내부적으로 JDBC API를 사용하는 것인가요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용] JPA가 결국 JDBC API를 사용해서 DB와의 접근을 하는 것이라고 설명하신 것 같은데 그럼 JPA 라이브러리 내부에 JDBC API도 가지고 있는 걸까요? 아니면 하이버네이트 라이브러리 내부에 JDBC API를 가지고 있는 걸까요? 패키지를 직접 확인해보고 싶은데 잘 모르겠어서 질문드립니다!