월 16,940원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
ddl을 사용하지 않고 mapping 시
안녕하세요, ddl로 현재 강의는 db sql 스크립트 없이 entity에서 객체를 통해서 설계한것이 sql로 jpa가 나가면서 테이블을 다 생성해 주는데, 만약에 ddl을 none으로 지정하고 db 스크립트를 일일이 다 적어 줘야 한다면, entity 코드 작성시에는 스크립트로 작성한 테이블과 컬럼 이름에 맞게 @Table, @Column, @JoinColumn의 name 속성으로 다 손수 적어줘야 하나요jpa로 자동생성되는 이름이 db에서 sql로 직접 작성한 컬럼, 테이블 이름과 다를 경우 mapping이 정상적으로 되지 않는지, 혹은 정상적으로 되는지가 궁금합니다.감사합니다.
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
영속성 컨택스트에 대한 이해
안녕하세요, 고생많으십니다.혼자 독학하는 입장에서, 제가 정확히 이 영속성 컨텍스트를 이해한것이 맞는지 확인차 질문 남겨봅니다.먼저, entitymanager를 사용하기 위해서는 tx안에서만 사용 가능하며 tx 안에서 em을 통해 entity 객체를 관리 하면서 만들어지는 가상 공간, 즉 1차 캐시가 영속성 컨텍스트라고 이해했습니다.entity manager를 통해 persist나 find등의 메소드를 통해서 managed 상태로 entity객체를 만들어 주면, 1차 캐시에 저장하게 되고, 해당 메소드에 따른 sql문이 쓰기 지연 sql 저장소에 쌓이게 되며, tx.commit()이 호출되어 tx가 커밋되는 시점에 flush()가 자동 호출되어, flash()시 snapshot과 현재 entity 객체 상태를 비교를 통해 다르면 update query가 쓰기 지연 저장소에 쌓이게 되고, db에 반영이 되고난 후, tx이 커밋되어( tx가 닫힘)걸로 이해했습니다.궁금한것이제가 정확하게 이해한것이 맞는지 궁금하며영속성 컨텍스트(1차 cache)에 있는 엔티티에 대한 정보는 준영속 상태일때에만 삭제되었다고 할수 있는지 궁금합니다.
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
PK 가 아닌 컬럼으로 Join 할 경우에 N+1 문제
안녕하세요JPA 강의를 수강하고 실무에 적용해보고 있는 개발자입니다.테이블 구조상 테이블 간의 Join 이 PK 가 아닌 필드(userName)로 걸려있어서 아래와 같이 @JoinColumn Annotation 을 사용하여 PK 아닌 컬럼으로 조인되도록 사용하고있습니다.@ManyToOne(fetch = FetchType.LAZY) @JoinColumn(referencedColumnName = "userName", name = "userName", updatable = false, insertable = false)이렇게 사용하였을때 userName field 에 접근하지 않았음에도 불구하고 Join 이 걸린 Entity 를 읽어오기 위한 N + 1 문제가 발생하는 것을 확인하였는데요. 구글링 해보았을때 PK 가 아닌 필드로 조인을 시도할 경우에 LAZY Fetch 가 무시될 수 있다고 하는데 혹시 PK 가 아닌 필드로 Join 을 시도할 경우에 LAZY Fetch 가 불가능한 것일까요??https://stackoverflow.com/questions/30082281/manytoonefetch-fetchtype-lazy-doesnt-work-on-non-primary-key-referenced-co 만약 불가능하다면 이런 상황에서 N + 1 문제를 해결할 수 있는 best practice 는 무엇일까요??
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
@Embeddable 과 @Embedded
안녕하세요! 강의 잘 듣고 있습니다.다름이 아니라, @Embeddable 부분에서 Period 클래스에 @Embeddable을 붙이고, Member에서 Period를 사요하려고 할 때 @Embedded 붙이기를 권장한다고 하셨지만, 생략해도 문제없이 돌아간다고 말씀해주셨는데요.저의 경우에는 에러가 발생해서 질문드립니다. 혹시 제가 잘못 설정한 부분이 있는 건가요?
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
SEQUENCE 전략 초기값과 호출 횟수 문의드립니다.
안녕하세요. 강의 열심히 듣고 있는 주니어 개발자입니다.강의 내용 똑같이 수행했으나 시퀀스 값이 다른 점이 있어 문의드립니다.(33:05) 부분에서 시퀀스 전략 속성값 initialValue=1, allocationSize=50 으로 설정했을시 persist 이전에 초기값이 -49라고 나오지만 제 환경에서는 초기값이 1로 나옵니다. H2 DB 2.1.214, Hibernate 5.6.10을 사용중인데 혹시 버전이 달라서 그런걸까요?로그에는 시퀀스에 대한 call next value를 호출하지 않으며 제 생각에도 initialValue=1로 명시되어 있기 때문에 초기값이 1인게 정상인 것 같은데 제가 놓치는 부분이 있는지 문의드립니다. 위 질문의 연장선으로 persist 1번 수행시 call next value 수행 결과는 아래와 같은데요. DB 시퀀스 자체의 increment값이 50이어서 51이 되는것은 이해하였습니다. JPA에서 51번째 데이터까지는 DB 시퀀스를 참조하지 않고 메모리에서 꺼내와야하는데 persist로 객체를 2번 저장시 아래와 같이 call next value가 2번 호출이 되고 시퀀스 값은 101이 됩니다.(33:43) 여기서 2번 호출 되는 이유가 JPA 애플리케이션에서 사용하는 allocationSize가 50이기 때문에 추후 자신이 사용할 메모리 시퀀스값을 선점하기 위해서라고 이해했는데요. (DB에는 51로 증가시켜놓고, 2부터 51까지 사용하기 위함) 이렇게 되면 제 경우에는 2를 사용하기 위해서 시퀀스 값을 101로 올려놓는 이상한 동작을 하는 것인데 이해가 가지 않습니다. 또한 위와 같이 52번째 객체 저장시 call next value가 한번 더 수행되어 시퀀스 값은 151이 됩니다.의도한대로 작동은 하지만 시퀀스가 한단계씩 밀려서 작동한다는 것이 이해가 가지 않습니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
엔티티 매니저를 close()해도 1차 캐시가 유지되나요?
안녕하세요, JPA 커리큘럼 강의들 잘 듣고 있습니다!기본편을 복습하다가 궁금해져서 질문 남기게 되었습니다.엔티티 매니저를 close()하면 영속성 컨텍스트가 종료 된다고 하여 "객체를 생성 -> persist() -> close() -> 같은 엔티티 조회" 과정을 거치면 처음 객체와 다시 조회한 객체가 다를 것이라 예상했습니다. 그런데 동일성 비교를 해보니 true가 나왔습니다. insert 쿼리도 트랜잭션 커밋 시점에 실행 되었고요!엔티티 매니저를 close() 해도 트랜잭션이 종료되지 않았다면 영속성 컨테스트가 유지되는 건지 궁금합니다!
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
다대일 연관관계 매핑 @JoinColumn 외래키 관련 질문드립니다.
안녕하세요! 다들 고생이 많으십니다.다대일 연관관계 매핑 중 질문이 있습니다.@ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "team_id", nullable = false, updatable = false) private Team team;위와 같이 다대일 연관관계 매핑시 @JoinColumn을 지정하여 외래키를 설정하여 관리 되는데이 경우 jpa가 생성하는 ddl을 보면 항상 물리적인 외래키가 항상 생성되고, @JoinColumn 생략 하더라도 물리적인 외래키가 생성되고 있는데필요에 따라 물리적인 외래키를 설정하지 않고 연관관계를 맺고 싶을때는 어떤 설정을 걸어야 할까요?방법이 있다면 @JoinColumn을 사용하여 일반적으로 생성된 물리적인 외래키가 존재하는 것과 JPA가 동작하는데 차이가 있을까요? 다른 방법이 없다면 최초 DDL 생성 이후 ddl-auto 옵션을 끄고, 엔티티 소스는 @JoinColumn을 유지하고 DB상 물리적인 외래키만 지우더라도 JPA가 동작 하는데에는 별다른 이슈가 없을까요? ** 추가로 강의, JPA 책 중 관련 내용이 있는 곳 이 있다면 알려주시면 감사하겠습니다.감사합니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
JdbcConnectionException 오류
안녕하세요 매인 클래스를 실행하니까 jdbc랑 연결이 안된다는 오류가 나네요어느 부분이 잘못된건지 모르겠네요 ㅜㅜ에러 코드 첨부합니다.C:\Users\Ran\.jdks\corretto-1.8.0_342\bin\java.exe -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:53962,suspend=y,server=n -javaagent:C:\Users\Ran\AppData\Local\JetBrains\IntelliJIdea2022.2\captureAgent\debugger-agent.jar -Dfile.encoding=UTF-8 -classpath "C:\Users\Ran\.jdks\corretto-1.8.0_342\jre\lib\charsets.jar;C:\Users\Ran\.jdks\corretto-1.8.0_342\jre\lib\ext\access-bridge-64.jar;C:\Users\Ran\.jdks\corretto-1.8.0_342\jre\lib\ext\cldrdata.jar;C:\Users\Ran\.jdks\corretto-1.8.0_342\jre\lib\ext\dnsns.jar;C:\Users\Ran\.jdks\corretto-1.8.0_342\jre\lib\ext\jaccess.jar;C:\Users\Ran\.jdks\corretto-1.8.0_342\jre\lib\ext\jfxrt.jar;C:\Users\Ran\.jdks\corretto-1.8.0_342\jre\lib\ext\localedata.jar;C:\Users\Ran\.jdks\corretto-1.8.0_342\jre\lib\ext\nashorn.jar;C:\Users\Ran\.jdks\corretto-1.8.0_342\jre\lib\ext\sunec.jar;C:\Users\Ran\.jdks\corretto-1.8.0_342\jre\lib\ext\sunjce_provider.jar;C:\Users\Ran\.jdks\corretto-1.8.0_342\jre\lib\ext\sunmscapi.jar;C:\Users\Ran\.jdks\corretto-1.8.0_342\jre\lib\ext\sunpkcs11.jar;C:\Users\Ran\.jdks\corretto-1.8.0_342\jre\lib\ext\zipfs.jar;C:\Users\Ran\.jdks\corretto-1.8.0_342\jre\lib\jce.jar;C:\Users\Ran\.jdks\corretto-1.8.0_342\jre\lib\jfr.jar;C:\Users\Ran\.jdks\corretto-1.8.0_342\jre\lib\jfxswt.jar;C:\Users\Ran\.jdks\corretto-1.8.0_342\jre\lib\jsse.jar;C:\Users\Ran\.jdks\corretto-1.8.0_342\jre\lib\management-agent.jar;C:\Users\Ran\.jdks\corretto-1.8.0_342\jre\lib\resources.jar;C:\Users\Ran\.jdks\corretto-1.8.0_342\jre\lib\rt.jar;C:\Users\Ran\Desktop\R\inflearn\JPA프로그래밍_기본편\새 폴더\jpa-basic\target\classes;C:\Users\Ran\.m2\repository\org\hibernate\hibernate-entitymanager\5.3.10.Final\hibernate-entitymanager-5.3.10.Final.jar;C:\Users\Ran\.m2\repository\org\jboss\logging\jboss-logging\3.3.2.Final\jboss-logging-3.3.2.Final.jar;C:\Users\Ran\.m2\repository\org\hibernate\hibernate-core\5.3.10.Final\hibernate-core-5.3.10.Final.jar;C:\Users\Ran\.m2\repository\org\javassist\javassist\3.23.2-GA\javassist-3.23.2-GA.jar;C:\Users\Ran\.m2\repository\antlr\antlr\2.7.7\antlr-2.7.7.jar;C:\Users\Ran\.m2\repository\org\jboss\jandex\2.0.5.Final\jandex-2.0.5.Final.jar;C:\Users\Ran\.m2\repository\com\fasterxml\classmate\1.3.4\classmate-1.3.4.jar;C:\Users\Ran\.m2\repository\javax\activation\javax.activation-api\1.2.0\javax.activation-api-1.2.0.jar;C:\Users\Ran\.m2\repository\org\dom4j\dom4j\2.1.1\dom4j-2.1.1.jar;C:\Users\Ran\.m2\repository\org\hibernate\common\hibernate-commons-annotations\5.0.4.Final\hibernate-commons-annotations-5.0.4.Final.jar;C:\Users\Ran\.m2\repository\javax\persistence\javax.persistence-api\2.2\javax.persistence-api-2.2.jar;C:\Users\Ran\.m2\repository\net\bytebuddy\byte-buddy\1.9.5\byte-buddy-1.9.5.jar;C:\Users\Ran\.m2\repository\org\jboss\spec\javax\transaction\jboss-transaction-api_1.2_spec\1.1.1.Final\jboss-transaction-api_1.2_spec-1.1.1.Final.jar;C:\Users\Ran\.m2\repository\com\h2database\h2\1.4.199\h2-1.4.199.jar;C:\Program Files\JetBrains\IntelliJ IDEA 2022.2.1\lib\idea_rt.jar" hellojpa.JpaMain 대상 VM에 연결되었습니다, 주소: '127.0.0.1:53962', 전송: '소켓' 9월 03, 2022 1:44:08 오후 org.hibernate.jpa.internal.util.LogHelper logPersistenceUnitInformation INFO: HHH000204: Processing PersistenceUnitInfo [ name: hello ...] 9월 03, 2022 1:44:08 오후 org.hibernate.Version logVersion INFO: HHH000412: Hibernate Core {5.3.10.Final} 9월 03, 2022 1:44:08 오후 org.hibernate.cfg.Environment <clinit> INFO: HHH000206: hibernate.properties not found 9월 03, 2022 1:44:08 오후 org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit> INFO: HCANN000001: Hibernate Commons Annotations {5.0.4.Final} 9월 03, 2022 1:44:08 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!) 9월 03, 2022 1:44:08 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator INFO: HHH10001005: using driver [org.h2.Driver] at URL [jdbc:h2:tcp://localhost/~/test] 9월 03, 2022 1:44:08 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator INFO: HHH10001001: Connection properties: {user=sa} 9월 03, 2022 1:44:08 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator INFO: HHH10001003: Autocommit mode: false 9월 03, 2022 1:44:08 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections <init> INFO: HHH000115: Hibernate connection pool size: 20 (min=1) 9월 03, 2022 1:44:10 오후 org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator initiateService WARN: HHH000342: Could not obtain connection to query metadata : null 9월 03, 2022 1:44:11 오후 org.hibernate.dialect.Dialect <init> INFO: HHH000400: Using dialect: org.hibernate.dialect.H2Dialect 9월 03, 2022 1:44:11 오후 org.hibernate.engine.jdbc.env.internal.LobCreatorBuilderImpl makeLobCreatorBuilder INFO: HHH000422: Disabling contextual LOB creation as connection was null 9월 03, 2022 1:44:11 오후 org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions WARN: SQL Error: 90067, SQLState: 90067 9월 03, 2022 1:44:11 오후 org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions 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:9) 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.net.DualStackPlainSocketImpl.waitForConnect(Native Method) at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) at java.net.Socket.connect(Socket.java:607) 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 대상 VM에서 연결 해제되었습니다. 주소: '127.0.0.1:53962', 전송: '소켓' 종료 코드 1(으)로 완료된 프로세스 package hellojpa; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; public class JpaMain { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); EntityManager em = emf.createEntityManager(); // em.close(); emf.close(); // 팩토리를 나중에 닫는다. } } pom<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>jpa-basic</groupId> <artifactId>ex1-hello.jpa</artifactId> <version>1.0.0</version> <dependencies> <!-- jpa 하이버네이트--> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>5.3.10.Final</version> </dependency> <!--h2데이터베이스--> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>1.4.199</version> </dependency> </dependencies> <!-- <properties>--> <!-- <maven.compiler.source>8</maven.compiler.source>--> <!-- <maven.compiler.target>8</maven.compiler.target>--> <!-- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>--> <!-- </properties>--> </project>persistence<?xml version="1.0" encoding="UTF-8"?> <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"> <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/~/test"/> <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.hbm2ddl.auto" value="create" />--> </properties> </persistence-unit> </persistence>
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
OneToOne FetchType.EAGER 질문드립니다.
안녕하세요. 이번에 열심히 수강한 학생입니다. 훌륭하신 강의 정말 감사드립니다.혹시 OneToOne FetchType.EAGER 질문 드립니다.예를들어 A(Entity)테이블이랑 B(Entity)테이블을 연관관계를 맺을 때A(Entity)테이블에서 @OneToOne(fetch=FetchType.EAGER)@JOinColumns({@JoinColumn(name="id", referencedColumnName="B_id", insertable=false, updatable=false)})이렇게 해서 A테이블의 정보를 findName으로 가져오면 A테이블 B테이블이 각각 싱글테이블 형태로 조회가 되는데 혹시 EAGER는 원래 A와B테이블이 조인되어서 가져와야 하는게 아닌지 질문드립니다. 감사합니다.!
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
양방향이 왜그렇게 안좋은건가요?
유저객체에서 List<Order>를 가지는게 왜 안좋나요?유저 주문 목록을 가지고 있으면 성능면에서 더 이득이 크지 않나요?주문목록을 유저가 가지고 있다면 해당 주문ID를 바로 검색해서 더 빠르게 조회할 수 있지 않나요?하지만 유저가 List를 갖고있지 않다면 모든 주문목록에서 유저ID로 하나하나 검색해나가면서 불러오는게 상대적으로 많이 느리지 않나요?양방향이 될 수 있으면 없는게 좋다고 하셨는데, 실제로 통계를 만들때나 각종 상황에서 서로가 서로를 참조하는 일이 많지 않나요?판매자 입장에서 판매하는 아이템의 구매자의 주소를 아는 것은 중요할 것이고, 팀 입장에서도 팀에 어느 선수들이 있는지 아는게 중요하지 않나요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
@orderColumn에서 update 쿼리 관련 질문이 있습니다
안녕하세요 강의를 듣던 중에 궁금한게 생겨서 남겨봅니다.@OrderColumn을 사용해서 AddressEntity 값 3개를 Member AddressHistory에 추가해보았고, 0,1,2로 값이 잘 나오는 걸 확인했습니다. 그런데 제가 0번 값을 삭제 해보았는 데, 예상했던 결과는 총 2번의 update 쿼리 후 1번의 delete 쿼리가 나가는 거였지만, 5번의 update 쿼리 후 1번의 delete 쿼리가 나갔습니다. 왜 이렇게 되는 지 이해가 안되서 올려봅니다.Hibernate: select addresshis0_.MEMBER_ID as MEMBER_I5_0_0_, addresshis0_.id as id1_0_0_, addresshis0_.POSITION as POSITION6_0_, addresshis0_.id as id1_0_1_, addresshis0_.city as city2_0_1_, addresshis0_.street as street3_0_1_, addresshis0_.zipcode as zipcode4_0_1_ from ADDRESS addresshis0_ where addresshis0_.MEMBER_ID=?Hibernate: /* delete one-to-many row jpabook.jpashop.domain.Member.addressHistory */ update ADDRESS set MEMBER_ID=null, POSITION=null where MEMBER_ID=? and id=?Hibernate: /* delete one-to-many row jpabook.jpashop.domain.Member.addressHistory */ update ADDRESS set MEMBER_ID=null, POSITION=null where MEMBER_ID=? and id=?Hibernate: /* delete one-to-many row jpabook.jpashop.domain.Member.addressHistory */ update ADDRESS set MEMBER_ID=null, POSITION=null where MEMBER_ID=? and id=?Hibernate: /* create one-to-many row jpabook.jpashop.domain.Member.addressHistory */ update ADDRESS set MEMBER_ID=?, POSITION=? where id=?Hibernate: /* create one-to-many row jpabook.jpashop.domain.Member.addressHistory */ update ADDRESS set MEMBER_ID=?, POSITION=? where id=?Hibernate: /* delete jpabook.jpashop.domain.AddressEntity */ delete from ADDRESS where id=?
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
JPA에 Index 힌트 적용 질문드립니다.
최근에는 실무에서 JPA위주로 쿼리를 짜다보니, 성능이 안나오는 쿼리에 대해서는 index 힌트를 줘야 하는 상황이 종종 생기고 있는데요, 혹시 이럴땐 어떻게 하시나요? 마이바티스로 하기에는 특정쿼리만 빼기에는 일관성이 없는거 같고..JPQL로 짜자니 인덱스 힌트 지원이 안되는걸로 알고있구요..@natvieQuery로 생짜 쿼리 짜서 인덱스 힌트 주는 방법 밖에 없을까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
혹시나 main 돌리는데 오류 뜨시는 분들..
강의 초반부에 메인 돌려보는데 이런 오류로그 뜨면서 안되시는분들...파란색줄 2번째꺼 클릭하면 pom.xml에<properties> 부분 자동으로 추가되는데이렇게 추가된후 오른쪽 상단 reload해주고main돌리면 잘돌아가여... 아마 자바버전이 11이신분들은 이거 추가해줘야 하는것 같아요~ps.혹시나 저처럼 오류뜨면 당황하는 초보분들 있을까봐 올립니다. 검색 해보면서 , 질문글 찾아보면서 설정 바꾸는거 이것저것 해봤는데 소용없더라고요..추가로 진행하시다Caused by: java.lang.ClassNotFoundException: javax.xml.bind.JAXBException이런 오류 뜨시면https://www.inflearn.com/questions/13985참고해보세요
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
연관 관계에 대해서 질문 드립니다.
회사에서는 JPA를 사용하는데 연관 관계 매핑을 아예 안쓰고 JPA를 사용하더라고요.이유를 물어보니 연관 관계 매핑 때문에 복잡해지고 다른 문제들도 많이 발생해서 연관 관계를 아예 안쓴다고 하는데.영한님 생각은 어떤가요?연관 관계 매핑을 맺지 않고 JPA를 사용하는 것도 괜찮나요? 그리고 그런 경우가 많이 있나요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
애플리케이션 안에서 Sequence 관리 질문
안녕하세요! 수강생입니다. 항상 감사하며 공부하고 있습니다.DB Sequence 관리에 대해서 질문이 있습니다.Sequence 를 확보하고 사용하는 것의 관리 범위는 영속성 컨텍스트가 아닌, 애플리케이션 범위인가요?예를 들어 한 애플리케이션 안에서 두 개의 트랜잭션 A, B가 병렬적으로 엔티티를 영속화 한다고 치면 A.Entity.id = 1B.Entity.id = 2A.Entity.id = 3...이런식으로 애플리케이션 단위로 공유되는 것인지 궁금합니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
일대일 optional 여부에 따른 UNIQUE 제약
안녕하세요! 강의를 너무나 잘 듣고 있습니다. 일대일 강의를 들으면서 이것저것 만져보다가 @OneToOne(optional=true) 인 경우에는 UNIQUE 제약이 걸리지 않고 반대로 false인 경우에는 UNIQUE 제약이 걸리는 것을 알게 되었습니다.혹시 이렇게 구현된 이유가 무엇인지 알 수 있을까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
깅의가 하나 빠진건가요? 53/54 로 표시되네요.
JPQL 벌크 연산이 마지막 강의인 줄 알았는데, 다음 강의가 또 있나요? 이것 때문에 진행도가 100%가 안 됩니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
엔티티 연관관계와 테이블의 관계가 헷갈려서 질문드립니다
안녕하세요.엔티티가 Member, Team 이렇게 있을 때, 멤버 1명이 팀을 옮기게 되면 add(member)를 해주고 team에서 기존 멤버를 빼주는 게 맞지만db 관점에서는 괜찮지만 어플리케이션에서는 지워주는게 맞다고 하셨는데요이 부분이 잘 이해가 가지 않습니다.해당링크 : (https://www.inflearn.com/questions/25417)우선 제가 현재 이해하고 있는 것을 말씀드려보겠습니다.저는 엔티티가 곧 테이블이라고 이해하고 있습니다. (틀리다면 정정해주시면 감사합니다)Member, Team 테이블이 각각 있을 때Team에는 team_id, team_name, list team member이렇게 설계가 되는 것까지는 이해했습니다.이 team 에서 list 는 실제 member 데이터가 삽입되는 것이 아니고 team에 있는 team_id를 통해 member 테이블에서 team으로 fk를 걸어 놓은 것으로 알고 있습니다.member가 team을 옮기게 될 경우, member가 team 에 걸어놓은 fk가 변경이 되기 때문에 member 쪽에서만 update 해줘도 된다고 이해하고 있고요.db 관점에서 괜찮다고 하시는 부분은 아마 이 부분을 말씀하시는 거 같고, 어플리케이션 관점은 영속성 컨택스트에서 관리되고 있는 데이터를 말씀하시는 것 같은데제가 제대로 이해하고 있는 게 맞을까요?맞다면 후자의 경우에는 영속성에서 관리되는 부분을 끊으면 된다는 이야기(비영속으로 적용)인 걸까요?감사합니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
Cascade와 saveAll 성능 비교
좋은 강의 항상 감사합니다.Cascade.ALL 혹은 PERSIST를 통해 OneToMany로 연관된 List를 조회하는 것과, SaveALL을 사용하는 것이 성능상 차이가 없는지 궁금합니다.직접 테스트를 돌려본 결과 반복문 + Save 가 가장 느렸고, Cascade.ALL, 이후 SaveAll 순이었으나, 거의 차이가 발생하지 않아 질문드립니다.제 생각으로는 CasecadeAll의 경우 루트 엔티티가 save될 때, 루트 엔티티와 동일한 Transaction을 사용하여, saveAll과 비슷한 형태로 작동할 것이라 생각하나, 확실치 않아 질문드립니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
hibernate.hbm2ddl.auto = create 했지만 FK 때문에 DROP에 실패
안녕하세요,hibernate.hbm2ddl.auto의 값을 create로 두고 실습을 진행하고 있는데첫 번째 질문은 1. create로 설정하고 수업을 따라하는 게 맞는지?두 번 째 질문은 처음 프로그램이 실행할 때 다음과 같은 에러메시지를 보여주면서 테이블 drop에 계속 해서 실패하는데 이게 기대하는 결과가 맞는지, 아니라면 어떻게 해결할 수 있는지 입니다. 에러메시지 : WARN: GenerationTarget encountered exception accepting command : Error executing DDL " drop table Category if exists" via JDBC Statement org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL " drop table Category if exists" via JDBC Statement at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:67) at org.hibernate.tool.schema.internal.SchemaDropperImpl.applySqlString(SchemaDropperImpl.java:375) at org.hibernate.tool.schema.internal.SchemaDropperImpl.applySqlStrings(SchemaDropperImpl.java:359) at org.hibernate.tool.schema.internal.SchemaDropperImpl.dropFromMetadata(SchemaDropperImpl.java:241) at org.hibernate.tool.schema.internal.SchemaDropperImpl.performDrop(SchemaDropperImpl.java:154) at org.hibernate.tool.schema.internal.SchemaDropperImpl.doDrop(SchemaDropperImpl.java:126) at org.hibernate.tool.schema.internal.SchemaDropperImpl.doDrop(SchemaDropperImpl.java:112) at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:144) at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:72) at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:310) at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:467) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:939) 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 jpabook.jpashop.JpaMain.main(JpaMain.java:16) Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Cannot drop "CATEGORY" because "FKJIP0OR3VEMIXCCL6VX0KLUJ03" depends on it; SQL statement:새로운 Entity를 추가하거나 Entity에 필드를 추가하는 실습을 할 때마다 일일히 직접 h2 콘솔에서 테이블을 몽땅 drop 해주지 않으면변경 사항을 확인할 수가 없는 상황입니다.감사합니다.