월 16,940원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
Javax Jakarta 차이
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]jpa를 import하면 import javax.persistence.* 이 아니라 import jakarta.persistence.*로 되어 있는데 이거는 상관 없는 건가요??
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
mySQL 사용 중 DB 자동 삭제가 안 됩니다.
안녕하세요. 저는 mySQL과 연동하여 JPA를 수강하고 있습니다. 테이블 자동 삭제 후 생성 옵션을 사용하여 강의를 듣고 있습니다.<property name="hibernate.hbm2ddl.auto" value="create"/> 근데 테이블을 삭제하려고 할 때 다른 테이블과 참조 제약조건때문에 삭제가 안 됩니다.ㅠㅠ mySQL 직접 들어가서 제약조건 삭제 후 직접 삭제하는 방법말고 자동으로 삭제할 수 있는 방법이 없을까요?Cannot drop table 'member' referenced by a foreign key constraint 'FK8rljbj20nmt1ae3qb3pu8ftym' on table 'member_product'.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
INFO: HHH000206: hibernate.properties not found
안녕하세요오류 관련된 모든 글 찾아봤는데도 해결되지 않아 글 남깁니다ㅠㅠ다음과 같은 오류가 계속 발생합니다.해당 설정파일들은, persistence.xml 파일pom.xml 파일데이터 베이스를 찾을 수 없다고 뜨는 것 같은데 해당 데이터 베이스는 잘 동작하는 것 확인했습니다.삭제했다가 추가로 생성한 건데도 안 돼요도저히 감이 안 잡히네요 ㅠㅠ 도움주시면 감사하겠습니다!하나 걸리는 것은 상관없는 부분일 수 있는데 password를 "sa"로 설정했는데, 오류 부분에는 **** 이렇게 떠서 걸리네요..!
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
h2 tcp 연결
h2 버전 : 2.1.214pom.xml 파일 내용<?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.6.14.Final</version> </dependency> <!-- H2 데이터베이스 --> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>2.1.214</version> </dependency> </dependencies> <properties> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> </project>persistence.xml 내용:<?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>여러번 h2 삭제 후 다시 설치해서 해봤는데..뭔가 windows 의 %userprofile% 경로가 문제인건지... 전체 경로를 넣고 해봐도 embeded로는 연결 되는데 tcp로는 계속 실패합니다. 그래서 build 시에도 계속 에러나서 진행이 되지 않고 있습니다.test2 만드는 건 다 해봤습니다.;;TCP 연결이 안되는 상황입니다.java.lang.IllegalStateException: Cannot get a connection as the driver manager is not properly initialized at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.getConnection(DriverManagerConnectionProviderImpl.java:220) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:181) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:68) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35) at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:101) at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:237) at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:51) at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:107) 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.connections.internal.BasicConnectionCreator.convertSqlException(BasicConnectionCreator.java:129) at org.hibernate.engine.jdbc.connections.internal.DriverConnectionCreator.makeConnection(DriverConnectionCreator.java:42) at org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator.createConnection(BasicConnectionCreator.java:62) at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections.addConnections(DriverManagerConnectionProviderImpl.java:457) at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections.<init>(DriverManagerConnectionProviderImpl.java:323) at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections.<init>(DriverManagerConnectionProviderImpl.java:297) at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections$Builder.build(DriverManagerConnectionProviderImpl.java:501) at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.buildPool(DriverManagerConnectionProviderImpl.java:101) at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.configure(DriverManagerConnectionProviderImpl.java:76) at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:107) 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:146) 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:101) at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) 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:175) 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:173) at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:127) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1460) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1494) 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) 12월 22, 2022 1:54:25 오후 org.hibernate.dialect.Dialect <init> INFO: HHH000400: Using dialect: org.hibernate.dialect.H2Dialect 12월 22, 2022 1:54:25 오후 org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions WARN: SQL Error: 90067, SQLState: 90067 12월 22, 2022 1:54:25 오후 org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions ERROR: Connection is broken: "java.net.SocketTimeoutException: connect timed out: localhost" [90067-214] 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:175) 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:173) at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:127) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1460) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1494) 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:37) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113) at org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator.convertSqlException(BasicConnectionCreator.java:131) at org.hibernate.engine.jdbc.connections.internal.DriverConnectionCreator.makeConnection(DriverConnectionCreator.java:42) at org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator.createConnection(BasicConnectionCreator.java:62) at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections.addConnections(DriverManagerConnectionProviderImpl.java:457) at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections.<init>(DriverManagerConnectionProviderImpl.java:323) at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections.<init>(DriverManagerConnectionProviderImpl.java:297) at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections$Builder.build(DriverManagerConnectionProviderImpl.java:501) at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.buildPool(DriverManagerConnectionProviderImpl.java:101) at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.configure(DriverManagerConnectionProviderImpl.java:76) at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:107) 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:146) 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:101) 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-214] at org.h2.message.DbException.getJdbcSQLException(DbException.java:678) at org.h2.message.DbException.getJdbcSQLException(DbException.java:477) at org.h2.message.DbException.get(DbException.java:212) at org.h2.engine.SessionRemote.connectServer(SessionRemote.java:437) at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:325) at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:122) at org.h2.Driver.connect(Driver.java:59) at org.hibernate.engine.jdbc.connections.internal.DriverConnectionCreator.makeConnection(DriverConnectionCreator.java:39) ... 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:399) at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:242) at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224) at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:403) at java.base/java.net.Socket.connect(Socket.java:591) at org.h2.util.NetUtils.createSocket(NetUtils.java:135) at org.h2.util.NetUtils.createSocket(NetUtils.java:99) at org.h2.engine.SessionRemote.initTransfer(SessionRemote.java:130) at org.h2.engine.SessionRemote.connectServer(SessionRemote.java:433) ... 33 more Process finished with exit code 1
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
@Temporal 과 @CreatedDate 차이가 궁금합니다.
안녕하세요 해당 강의에서 날짜에는@Temporal 어노테이션을 사용하셨는데 김영한님과 친하신 배민 개발자 출신 jojoldu님은 @CreatedDate @LastModifiedDate를 사용하여생성일 / 수정일을 나타내더라고요 @Temporal과 @CreatedDate @LastModifiedDate의 차이점이 궁금합니다@Temporal은 Time, Date, TimeStamp 이렇게 3가지 타입으로 나타낼 수 있다 날짜,시간을 나타내고 싶지만 Created, Modify가 아닌 경우에 사용한다. 이렇게 2가지 차이점을 생각해봤는데 이게 맞을까요...?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
즉시로딩 성능 저하 관련
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]먼저 좋은 강의를 제공해주셔서 감사드립니다.강의 [즉시 로딩과 지연 로딩][24:22] 에서즉시 로딩을 쓰면 쿼리가 수십 개 나가고 성능이 안 좋아진다고 하셨는데요. 성능이 안 좋아지는 건 발생한 SQL 로그로 파악하는 걸까요? 성능을 측정할 수 있는 도구가 혹시 있을까요?강의 내용에서 즉시 로딩의 이론적인 개념은 이해해서 실무에서 잘 활용할 수 있을 거 같은데ㅎㅎ이걸 몰랐을 때 성능 저하되는 걸 수치적으로 확인하고 그게 쿼리 쪽 문제인지 찾게 되는 접근 방법도 혹시 있을 까 궁금하여 문의드립니다.
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
벌크 연산 11:09 em.clear()를 하지 않았는데.....
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]Team teamA = new Team(); teamA.setName("teamA"); em.persist(teamA); Team teamB = new Team(); teamB.setName("teamB"); em.persist(teamB); Member member1 = new Member(); member1.setUsername("member1"); member1.setAge(10); member1.changeTeam(teamA); em.persist(member1); Member member2 = new Member(); member2.setUsername("member2"); member2.setAge(20); member2.changeTeam(teamA); em.persist(member2); Member member3 = new Member(); member3.setUsername("member3"); member3.setAge(30); member3.changeTeam(teamB); em.persist(member3); em.flush(); em.clear(); int resultCount = em.createQuery("update Member m set m.age = 100") .executeUpdate(); Member findMember = em.find(Member.class, member1.getId()); System.out.println("findMember.getAge() = " + findMember.getAge());em.clear()를 하지 않으면 10이 나와야 할거 같은데 100이 변경된게 영속성 컨텍스트에 반영이 된거 처럼 나오는데.스펙이 바뀐걸까요? 아니면 제가 뭘 잘 못한걸까요?https://drive.google.com/file/d/1qzmIqCOXOeCdy5McL0_RzcbugxbmdyMV/view?usp=share_link
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
저만 이상하게 되나요? 21:36 join fetch 해도 2번만 나오는 이유가....
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]@ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "team_id") private Team team;Team teamA = new Team(); teamA.setName("teamA"); em.persist(teamA); Team teamB = new Team(); teamB.setName("teamB"); em.persist(teamB); Member member1 = new Member(); member1.setUsername("member1"); member1.setAge(10); member1.changeTeam(teamA); em.persist(member1); Member member2 = new Member(); member2.setUsername("member2"); member2.setAge(20); member2.changeTeam(teamA); em.persist(member2); Member member3 = new Member(); member3.setUsername("member3"); member3.setAge(30); member3.changeTeam(teamB); em.persist(member3); em.flush(); em.clear(); String query = "select t from Team t join fetch t.members"; List<Team> result = em.createQuery(query, Team.class) .getResultList(); System.out.println("result.size() = " + result.size());패치 조인을 해도 왜 2번만 나올까요?혹시나 해서 파일도 올려봅니다.https://drive.google.com/file/d/1nOHKHJdVRezwrNpd_1G_3-EyeD8Neymg/view?usp=share_link
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
1차 캐시 용량 및 INSERT INTO 관련 질문입니다.
현재 API 통신을 통해서 데이터를 전달을 받고 있습니다.대략 갯수는 7만개 정도 됩니다.하지만 INSERT 쿼리는 21222개만 JPA에서 날라가고 있어서 DB에는 21222개만 적재가 되고 있습니다. 개인적인 추측으로는 1차 캐시에 저장할 수 있는 최대 용량이 21222개라서 라고 생각하고 있습니다.이러한 경우 1차 캐시의 용량을 설정하려면 어디서 해야할 지 질문드립니다!YML에서 설정을 잡아주면 될까요?이 외에도 다른 가능성이 있을지 궁금합니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
강의자료와 실제 생성 테이블이 다르고, Address가 값 객체일 수 없다고 생각합니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요. 김영한님의 강의를 잘 보고 있습니다. 강의를 보던도중, 문득 의문점이 들어서 여쭤보고자 질문을 작성하게 되었습니다. 질문의 테마는 값 타입 컬렉션과 기본키라고 할 수 있겠네요.기본 지식테이블은 기본키가 있을수도, 없을수도 있다.제가 배운대로는, 테이블은 기본키가 존재할 수도 있고 존재하지 않을 수도 있다고 배웠습니다. 그리고 기본키를 두는 이유는 기본키가 겹치지 않도록 해서, 데이터 중복을 막고, 조회 시 효율 증가를 위해서라고 생각했습니다. 김영한님의 강의에서 말하는 값타입은 주소가 다르더라도 안에 있는 값이 모두 같다고 하신걸로 이해했습니다.그래서 자바 객체가 값타입으로 들어가는 경우에는 equals를 통해서 같은지를 비교한다는 것도요!! 김영한님의 강의 중 예제로 들어주셨던 Member의 favoriteFoods, addressHistory는 값 타입을 데이터베이스 테이블로 변환한 예시로 이해했습니다.그리고 강의 내용에서 JPA를 이용해서 Table 구조를 생성하는 걸로 이해했습니다. 여기까지가 제가 이해한 내용입니다. 저는 그래서 해당 구조로 데이터베이스를 만들어준다고 인지했고, FAVORITE_FOOD, ADDRESS는 각각 중복값이 들어갈 수없다고 생각했습니다. 문제상황하지만 테이블의 생성 내용을 보면, 기본키 설정 부분이 빠져 있습니다.외래키 매핑만 되어 있고 실제로 기본키 부분이 빠져있습니다.제가 만든, ADDRESS 테이블을 예시로 들면,이는, FAVORITE_FOOD 도 동일합니다. 정말 중복값이 들어갈 수 없는지 테스트해보았습니다.테스트를 위한 코드는 다음과 같습니다.Address address = new Address("newCity", "street", "10000"); Member member1 = new Member(); member1.setName("member1"); member1.setHomeAddress(address); member1.getFavoriteFoods().add("치킨"); member1.getFavoriteFoods().add("치킨"); member1.getFavoriteFoods().add("치킨"); member1.getFavoriteFoods().add("피자"); member1.getFavoriteFoods().add("족발"); Address oldAddress = new Address("oldCity3", "street", "10000"); member1.getAddressList().add(new Address("oldCity", "street", "10000")); member1.getAddressList().add(new Address("oldCity2", "street", "10000")); member1.getAddressList().add(new Address("oldCity3", "street", "10000")); member1.getAddressList().add(new Address("oldCity3", "street", "10000")); member1.getAddressList().add(new Address("oldCity3", "street", "10000")); em.persist(member1); 결과값은 다음과 같습니다.값을 보게되면, FAVORITE_FOOD의 경우는 Set 자료구조 사용으로 중복값이 들어갈 수 없는 것이고, ADDRESS의 경우는 중복값이 들어갈 수 있었습니다. 만약 값의 변경이 일어나는 경우에는 어떻게 될까? 하는 고민이 생겨, 중복으로 들어있는 내용의 값을 변경해보았습니다.Address address = new Address("newCity", "street", "10000"); Member member1 = new Member(); member1.setName("member1"); member1.setHomeAddress(address); member1.getFavoriteFoods().add("치킨"); member1.getFavoriteFoods().add("치킨"); member1.getFavoriteFoods().add("치킨"); member1.getFavoriteFoods().add("피자"); member1.getFavoriteFoods().add("족발"); Address oldAddress = new Address("oldCity3", "street", "10000"); member1.getAddressList().add(new Address("oldCity", "street", "10000")); member1.getAddressList().add(new Address("oldCity2", "street", "10000")); member1.getAddressList().add(new Address("oldCity3", "street", "10000")); member1.getAddressList().add(new Address("oldCity3", "street", "10000")); member1.getAddressList().add(new Address("oldCity3", "street", "10000")); em.persist(member1); em.flush(); em.clear(); Member findMember = em.find(Member.class, member1.getId()); System.out.println("================== Start 2 =================="); findMember.getAddressList().remove(oldAddress); findMember.getAddressList().add(new Address("newCity1", "street", "10000")); tx.commit(); 결과값은 다음과 같습니다.중복값을 한번에 지워준다면, 그래도 결과적으로는 ADDRESS값을 중복이 없는 값객체로 쓸 수 있겠다고 생각했지만, 모두 지우지 않고 중복값을 하나만 지웠습니다.물론 List의 특성 상 중복 값 한개만 지우는게 당연하지만요. 가설목표하던 테이블 구조로 실제로 만들어지지 않았다고 생각했습니다. -> 기본키가 없다.왜냐하면 생성하고자 하는 테이블 구조와 생성된 테이블 구조가 다르기 때문입니다.음식에서 중복이 생기지 않는 이유는 Set의 특성 때문이지 테이블 때문이 아니라고 생각이 들었습니다. 값 객체의 특성 상 중복을 허용하는 경우는 없다.좋아하는 음식의 경우 같은 음식이 두번 있을 이유는 없지만, 이전의 주소의 경우는 같은 주소에 두번 이사갈 수 있다.그렇다면 음식과 다르게 주소의 경우는 중복이 가능하고, 값을 추적할 수 있어야 하므로 Entity로 사용하는게 맞지 않을까요?이 부분은 김영한님깨서 설명해주신 부분과 일치하지만, 결론까지 도달한게 맞는지 궁금합니다. 두서 없이 길게 적은 것 같은데, 제가 생각한 가설이 맞는지가 궁금합니다. 그리고 나아가 가설까지 도달하는 방식에 문제가 있거나 고칠점이 있다고 피드백도 부탁드립니다. 읽어주셔서 감사합니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
@Query vs QueryDsl
@Query 내부적으로 문자로 JPQL을 적어야 하는 순간에는 무조건 QueryDsl로 type-safe하게 쿼리를 작성하고 있었습니다 이부분을 좀 생각해보니까SELECT DISTINCT t FROM Team t JOIN FETCH t.members WHERE t.id = :teamIdSELECT m FROM Member m JOIN FETCH m.team예시와 같은 간단한 쿼리들도 전부 QueryDsl로 옮기다보니까 굳이 @Query로 작성하지 않고 옮겨서 작성해야하나 라는 생각이 들었습니다 영한님의 경우 문자로 JPQL을 작성해야하는 순간은 전부 QueryDsl로 작성하시는지 궁금해서 질문을 남기게 되었습니다
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
@Embedded 와 @EmbeddedId 의 차이
안녕하세요 값 타입 중 임베디드 타입에 대해서 공부하고 있는데, @Embeddable 과 @Embedded 외 @EmbeddedId 라는 어노테이션도 있더라구요,@Entity @Table(name = "Area") public class AreaJpaEntity { @EmbeddedId private AreaId id; ... } @Embeddable public class AreaId { @column(name = "area_alpha_name") private String areaAlphaName; @column(name = "area_num_name") private String areaNumName; ... } @EmbeddedId가 @Embedded와 유사하게 쓰이는 것 같은데, 정확히 어떤 차이점이 있는건가요? 그리고 @EmbeddedId로 선언된 타입도 임베디드 타입으로 볼 수 있는거죠?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
즉시로딩과 지연로딩 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]즉시로딩과 지연로딩 강의3:16 부분에서JpaMain 을 실행하면 저 같은 경우 에는ERROR: HHH000315: Exception executing batch [org.h2.jdbc.JdbcBatchUpdateException: Unique index or primary key violation: "PRIMARY KEY ON PUBLIC.TEAM(TEAM_ID) [1, NULL, NULL, NULL, NULL, 'teamA']"; SQL statement:위와 같은 에러가 발생하는데요.이미 데이터가 들어가있어서 발생한다는 오류로 알고 있습니다.하지만 강사님의 경우에는 데이터가 들어가 있는 상태에서 한번 더 실행해도 저와 같은 에러는 발생하지 않는데어떻게 고쳐야 하는지 궁금해서 질문드립니다.부연설명을 더 하자만DB를 아예 삭제했다가 실행하면 에러는 발생하지 않고 강의대로 실행되지만 데이터가 들어간 시점에서 한번 더 실행하면 위와 같은 에러가 발생하는 상황입니다.추가로 해당부분 깃헙에 올려놓은 코드입니다!https://github.com/castela0119/hello_jpa/commit/c5f3435e99d58404fb41d6585bd0f3f7d0919b34
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
일대다 단방향에 관해 질문드립니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]@OneToMany @JoinColumn(name = "TEAM_ID") private List<Member> members = new ArrayList<>();1:N 단방향에서 이렇게 작성한 경우 여기서 N이 Member 인지 어떻게 판단하는 건가요? 따로 지정하지 않아도 List에 들어가는 클래스로 판단할 수 있는건가요??
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
사용자 정의 함수 (rank 함수)
안녕하세요.사용자 정의 함수 등록을 통해 rank 함수를 사용하고 싶은데 rank 함수는 rank()와 over() 두개의 함수로 이루어져 있는데 rank() 와 over() 모두 정의를 해줘야 되나요??그리고 사용할 경우 인자 값은 어떻게 줘야 될까요?"PARTITION BY [변수명] ORDER BY [변수명] DESC"이런식으로 스트링 값을 넣어주면 되는걸까요?DB는 mysql 8버전 이상 사용하고 있습니다.
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
데이터베이스 스키마 자동생성 hibernate-update
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]pom.xml persistence.xmlMemberconsole창h2databasehibernate의 create와 create-drop은 아무 이상없이 실행이 되는데 update는 실행을 하면 alert는 실행이 안되고 select만 실행이 됩니다 무엇이 문제인지 알수있을까요??
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
프록시와 연관관계 관리 - orphanRemovel 관련 질문
안녕하세요.[프록시와 연관관계 관리 - orphanRemovel] 내용에서 질문드립니다.orphanRemovel = false, cascade = ALL 로 설정한 상태에서 @OneToMany로 설정된 컬렉션 내의 값을 제거하면, cascade 옵션에 의해 update 쿼리가 나갈 때 컬렉션에서 제거된 원소가 같이 삭제되어야 하는게 아닌가요?위 내용이 틀렸다면 cascade의 delete 쿼리는 부모 엔티티 '자체'가 사라졌을 때만 컬렉션 내의 자식 엔티티들에게 전이되는 걸까요??추가로, 고아 객체 제거 기능은 cascade와 마찬가지로, 연관관계의 주인이 아닌 컬럼에서도 사용이 가능한건지도 궁금합니다!내용이 잘 이해되질 않아 질문이 다소 두서없는 점 죄송합니다ㅜ
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
org.hibernate.annotaion.Table 사용에 관한 질문입니다.
해당 어노테이션을 이용해서 테이블 주석을 달고 싶은데 작동을 하지 않습니다.어떠한 경우인지 궁금해서 질문 올려봅니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
프로젝트 생성
org.example 프로젝트의 양이 많아서 새로운 폴더를 만들고 작업하려하니INFO: HHH000400: Using dialect: org.hibernate.dialect.H2DialectException in thread "main" org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: org.example.MemberProduct.products in org.example.Product.memberProductss at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:785) at org.hibernate.cfg.annotations.CollectionBinder$1.secondPass(CollectionBinder.java:736) at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:54) at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1696) at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1664) at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:287) 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 jpa_join_project.Main.main(Main.java:10) 위와같은 오류가 발생합니다. ㅠ
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
자식객체 조건을 걸어 부모객체를 가지고 왔을때 부모객체 밑에 자식객체 데이터가 그대로입니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.안녕하세요 궁금한게 있어 글을 남깁니다. 예를 들어서 유저가 있고 유저가 쓰는 게시글이 있습니다. 유저 1 : 게시글 N // 유저 1 : 차단 N게시글 1 : 채팅 N // 유저 1 : 채팅 N 이 상황에서 질문 글 조회 할 경우 글 객체에 채팅 리스트들을 가져다가 쓰고 있습니다. 이제 질문입니다. 저 질문글에 제목 질문 그리고 채팅방이 몇개있는지를 표현 하고 싶은데 차단한 유저의 채팅방은 카운트를 안했으면 합니다. 유저 인덱스로 내가 차단한 유저 리스트를 가지고 온뒤 게시글을 조회할때 select *from Qa q join Room r on q.idx = r.q.idxwhere r.댓글작성자Idx not in (차단자 리스트) 해서 게시글을 조회 하였을경우 게시글을 가지고 온뒤 객체 안을 보면 여전히 차단자 리스트에 포함되어있는 채팅방까지 나옵니다. 이럴 경우 자식리스트 (oneToMany) 객체의 조건을 걸고 싶을땐 어떻게 해야하나요 ? 질문을 최대한 정리 하려했는데도 가독성이 좋지 못하네요 . 제 질문이 이해 안되시는 부분이 있다면 얘기 부탁드리겠습니다.