월 16,940원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
주 테이블에 외래 키 단점
안녕하세요!일대일매핑을 '주 테이블에 외래 키'로 사용했을 때 단점이 값이 없으면 외래 키에 null을 허용하는 것이라고 되어있는데 이 부분 잘 이해가 되지 않아서요ㅜㅜ'대상 테이블에 외래 키' 방식으로 일대일 매핑을 하더라도 결국 대상 테이블 입장에서는 값이 없으면 null이 들어가는 건 마찬가지 아닌가요??
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
객체 탐색이 필요 없는 경우에도 연관관계를 사용하는 것이 좋을까요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]애플리케이션 로직 상 Member 객체에서 Team 객체를 탐색하는 경우가 없을 때, 즉 객체의 외래키 식별자(team_id)를 갖고 있어도 충분하다면 객체의 연관관계를 사용해야 하는지 궁금합니다. 객체의 연관관계를 사용하는 것은 객체 지향적인 방법이고, 자유로운 객체 탐색이 가능하다는 것은 충분히 이해했으나 이러한 장점을 누릴 필요가 없을 때에도 확장성을 고려해 객체의 연관관계를 사용하는 것이 좋을까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
sql의 기초만 아는데 sql 문 따로 학습 후 들어야할까요? 아님 동시에 하루 1시간 sql 이런식으로 같이 들어오될까요
sql의 기초만 아는데 sql 문 따로 학습 후 들어야할까요? 아님 동시에 하루 1시간 sql 이런식으로 같이 들어오될까요
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
기본키 매핑 강의
Member.java @Entity public class Member { //기본키 맵핑 @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private String id; @Column(name = "name", nullable = false) private String username; public Member() {} public void setUsername(String username) { this.username = username; } public String getUsername() { return username; } public void setId(String id) { this.id = id; } public String getId() { return id; } } Main.java public class Main { 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.setId("ID_A"); member.setUsername("임연주"); em.persist(member); tx.commit(); } catch (Exception ex) { tx.rollback(); } finally { em.close(); } emf.close(); } }persistent.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="1234"/> <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>pom.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>org.example</groupId> <artifactId>jpast_01</artifactId> <version>1.0-SNAPSHOT</version> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>19</source> <target>19</target> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.0</version> </dependency> <!-- 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>2.1.214</version> </dependency> </dependencies> </project>코드는 위와 같습니다.12월 08, 2022 2:27:42 오후 org.hibernate.jpa.internal.util.LogHelper logPersistenceUnitInformation INFO: HHH000204: Processing PersistenceUnitInfo [name: hello] 12월 08, 2022 2:27:42 오후 org.hibernate.Version logVersion INFO: HHH000412: Hibernate ORM core version 5.6.5.Final 12월 08, 2022 2:27:43 오후 org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit> INFO: HCANN000001: Hibernate Commons Annotations {5.1.2.Final} 12월 08, 2022 2:27:43 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!) 12월 08, 2022 2:27:43 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator INFO: HHH10001005: using driver [org.h2.Driver] at URL [jdbc:h2:tcp://localhost/~/test] 12월 08, 2022 2:27:43 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator INFO: HHH10001001: Connection properties: {password=****, user=sa} 12월 08, 2022 2:27:43 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator INFO: HHH10001003: Autocommit mode: false 12월 08, 2022 2:27:43 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections <init> INFO: HHH000115: Hibernate connection pool size: 20 (min=1) 12월 08, 2022 2:27:43 오후 org.hibernate.dialect.Dialect <init> INFO: HHH000400: Using dialect: org.hibernate.dialect.H2Dialect Hibernate: drop table if exists Member CASCADE 12월 08, 2022 2:27:45 오후 org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnection INFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@f1a45f8] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode. Hibernate: create table Member ( id varchar(255) generated by default as identity, name varchar(255) not null, primary key (id) ) 12월 08, 2022 2:27:45 오후 org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnection INFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@1431267b] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode. 12월 08, 2022 2:27:45 오후 org.hibernate.tool.schema.internal.ExceptionHandlerLoggedImpl handleException WARN: GenerationTarget encountered exception accepting command : Error executing DDL " create table Member ( id varchar(255) generated by default as identity, name varchar(255) not null, primary key (id) )" via JDBC Statement org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL " create table Member ( id varchar(255) generated by default as identity, name varchar(255) not null, primary key (id) )" via JDBC Statement at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:67) at org.hibernate.tool.schema.internal.SchemaCreatorImpl.applySqlString(SchemaCreatorImpl.java:458) at org.hibernate.tool.schema.internal.SchemaCreatorImpl.applySqlStrings(SchemaCreatorImpl.java:442) at org.hibernate.tool.schema.internal.SchemaCreatorImpl.createFromMetadata(SchemaCreatorImpl.java:325) at org.hibernate.tool.schema.internal.SchemaCreatorImpl.performCreation(SchemaCreatorImpl.java:169) at org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:138) at org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:124) at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:164) at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:81) at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:335) at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:471) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1498) 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 org.example.Main.main(Main.java:14) Caused by: org.h2.jdbc.JdbcSQLFeatureNotSupportedException: Feature not supported: "CHARACTER VARYING(255)"; SQL statement: create table Member ( id varchar(255) generated by default as identity, name varchar(255) not null, [50100-214] at org.h2.message.DbException.getJdbcSQLException(DbException.java:556) at org.h2.message.DbException.getJdbcSQLException(DbException.java:477) at org.h2.message.DbException.get(DbException.java:223) at org.h2.message.DbException.get(DbException.java:199) at org.h2.message.DbException.getUnsupportedException(DbException.java:287) at org.h2.command.ddl.SequenceOptions.getBounds(SequenceOptions.java:316) at org.h2.command.ddl.SequenceOptions.getBounds(SequenceOptions.java:244) at org.h2.schema.Sequence.<init>(Sequence.java:100) at org.h2.table.Column.initializeSequence(Column.java:459) at org.h2.command.ddl.CommandWithColumns.generateSequences(CommandWithColumns.java:103) at org.h2.command.ddl.CreateTable.update(CreateTable.java:113) at org.h2.command.CommandContainer.update(CommandContainer.java:169) at org.h2.command.Command.executeUpdate(Command.java:252) at org.h2.server.TcpServerThread.process(TcpServerThread.java:408) at org.h2.server.TcpServerThread.run(TcpServerThread.java:191) at java.base/java.lang.Thread.run(Thread.java:1589) at org.h2.message.DbException.getJdbcSQLException(DbException.java:556) at org.h2.engine.SessionRemote.readException(SessionRemote.java:637) at org.h2.engine.SessionRemote.done(SessionRemote.java:606) at org.h2.command.CommandRemote.executeUpdate(CommandRemote.java:227) at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:252) at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:223) at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:54) ... 15 more 12월 08, 2022 2:27:45 오후 org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator initiateService INFO: HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] 12월 08, 2022 2:27:45 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PoolState stop INFO: HHH10001008: Cleaning up connection pool [jdbc:h2:tcp://localhost/~/test] Process finished with exit code 0 오류 내용은 위와 같습니다. 왜 이런 오류가 발생하는지 원인 파악이 잘 안됍니다..
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
Named 쿼리 xml 작성 질문입니다
<properties> 선언 전에<mapping-file>META-INF/ormMember.xml</mapping-file>이 구문을 먼저 작성할 땐 에러가 안뜨는데mapping-file 을 먼저 선언 후 properties 선언을 하니 잘 작동합니다 어떤 원리인가요
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
영속성 컨텍스트에서 엔티티 수정 부분
영속성 컨텍스트에서 엔티티 수정 부분입니다.select쿼리는 나오는데 update가 실행이 안됍니다...캐시 삭제 해봤는데 동일합니다.
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
Wrong user name or password [28000-214] 오류
아래 사진처럼 설정을 해줬는데도 불구하고 아래 오류내용이 뜹니다. 어떻게 해결해야될지 모르겠습니다ㅠㅠ ERROR: Wrong user name or password [28000-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: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 org.example.Main.main(Main.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 moreCaused by: org.h2.jdbc.JdbcSQLInvalidAuthorizationSpecException: Wrong user name or password [28000-214] at org.h2.message.DbException.getJdbcSQLException(DbException.java:510) at org.h2.message.DbException.getJdbcSQLException(DbException.java:477) at org.h2.message.DbException.get(DbException.java:223) at org.h2.message.DbException.get(DbException.java:199) at org.h2.message.DbException.get(DbException.java:188) at org.h2.engine.Engine.validateUserAndPassword(Engine.java:393) at org.h2.engine.Engine.createSession(Engine.java:206) at org.h2.server.TcpServerThread.run(TcpServerThread.java:175) at java.base/java.lang.Thread.run(Thread.java:1589) at org.h2.message.DbException.getJdbcSQLException(DbException.java:510) at org.h2.engine.SessionRemote.readException(SessionRemote.java:637) at org.h2.engine.SessionRemote.done(SessionRemote.java:606) at org.h2.engine.SessionRemote.initTransfer(SessionRemote.java:163) at org.h2.engine.SessionRemote.connectServer(SessionRemote.java:433) 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:38) ... 29 moreProcess finished with exit code 1
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
remove 메서드 관련해서 질문이 있습니다!
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요. 엔티티 매니저 remove() 메서드 관련 질문이 있습니다.remove는 영속성 컨텍스트의 1차 캐시에서 엔티티를 삭제하고, DB의 데이터를 delete 해주는 메서드로 알고 있습니다. 여기서 문제는 1차 캐시에서 엔티티를 삭제한다는 것이 "전체 데이터를 지우는 것(key:value)"인지 아니면 "해당 식별자에 할당된 데이터(value)"를 지우는 것인지가 궁금합니다. 위에서 그림에서 member를 remove 한 후에 remove된 member id를 받아 조회를 수행했습니다.저는 1차 캐시에서 삭제된다고 알고 있었기에 select 쿼리가 실행될 것이라고 예상했으나 다음과 같이 select 쿼리가 실행되지 않았습니다.제가 remove를 제대로 이해못한 것 같은데, remove를 수행하면 1차 캐시에서 바로 삭제되지 않는 걸까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
@JoinTable
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.Member, Post 연관관계 매핑할 때 다음처럼 MEMBER_POSTS 테이블이 자동으로 생성됩니다..JoinTable을 사용하지도 않았는데 왜 생기는 건가요?domain/Member , domain/Post 봐주시면 됩니다. 감사합니다!https://github.com/320Hwany/board
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
연관관계 주인
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.두 개의 Parent, Child 엔티티가 있는데em.persist()로 엔티티를 영속상태로 만들 때 parent부터 저장했는데 연관관계의 주인이 child여서 child를 나중에 저장하는건가요?
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
서비스에서 외래 키 사용에 대해 질문 드립니다
안녕하세요!공부를 하다보니 실제 서비스에서는 외래 키 사용을 안하는 경우가 많다는데 외래 키가 없는 게 이해가 안 되어 질문 드립니다..연관관계 매핑 이런것들을 안 쓰는 건가요?
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
기본키 수정
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]게시판을 만들다가 궁금한 점이 생겨서 질문드립니다. 게시판에서 게시물을 삭제하면 그에 맞게 글 번호가 연속된 오름차순으로 재정렬되게 하는 것이 목적입니다. 저는 일단 view에서 페이징 정보를 이용해서 페이지마다 계산해서 제가 구현하고자 하는 기능을 만들기는 했습니다. 하지만 이를 db pk 값을 이용해서 구현할 수도 있을 거라 생각이 들었습니다. db의 pk값을 그대로 view에 뿌리고 게시물을 삭제하면 그에 따라 삭제된 게시물의 pk값 보다 큰 게시물의 pk를 1씩 감소하게 말입니다. 1씩 감소시키는 것은 서비스 로직에서 변경감지 기능을 사용했습니다. pk값을 다루는 거라 뭔가 위험하다는 생각은 들었으나 기술적인 부분에 집중하고자 했습니다.하지만 에러가 났고 저는 에러가 난 이유는 db의 외래키 제약조건이 on update restrict로 설정이 되어있다고 판단했습니다. 따라서 mysql에서 해당하는 테이블의 외래키 제약조건을 on update cascade로 수정을 해서 다시 실행해봤지만 그래도 여전히 에러가 났습니다. 구글링을 통해 알아봤는데 단순히 JPA에서는 기본키를 변경하는 것을 허용하지 않는다. 필요하다면 mybatis나 jdbctemplate을 써라정도만 나와있습니다. 여기서 제가 궁금한점은저는 직접 mysql에서 외래키 제약 조건을 수정했는데 jpa에서 쿼리를 날려서 외래키 제약 조건을 수정하는게 가능한가요? 다른 db접근 기술과 달리 jpa에서 기본키를 변경을 못하는 이유가 뭔지 알 수 있을까요? 그냥 JPA에서 무턱대고 막아둔게 아니라면 그 이유가 궁금합니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
실습 코드
실습 코드를 다운받을 수 있는 곳이 있을까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
영속성 컨텍스트 1차캐시
영속성 컨텍스트와 1차 캐시가 같은 개념인지 궁금합니다.
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
결국 영속성 컨텍스트가 중요한건가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요.강의를 듣다보니까 제 생각이 맞는지 궁금해서 질문남깁니다. 영속성 컨텍스트가 존재하는 이유는 결국에는 실제 DB를 거치지 않고 빠른 반환을 제공하기 위해 1차캐시에 필요한 데이터가 존재한다면 그걸 바로 사용하자! 인가요?PROXY객체를 생성하여 사용하는건 N+1문제를 해결하기 위한건가요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
jpql 로도 3중조인이 가능한가요?
JPQL로 3중 조인이 가능할까요?
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
양방향 연관관계에서 연관관계 편의 메서드 위치에 대해 질문드립니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요. 좋은 강의 덕분에 양질의 지식을 비교적 수월하게 습득하고 있습니다.양방향 연관관계에서 편의 메서드는 어디에 위치하는게 좋은지 여쭙고자 합니다.(비슷한 질문들을 봤지만 이러한 경우에 어떤게 가장 좋은 선택일지 궁금하여 질문드립니다.)비슷한 질문1 : https://www.inflearn.com/questions/16308비슷한 질문2 : https://www.inflearn.com/questions/99330 현재상태위와 같이 일대다(1:N) 관계가 있고 Team 을 애그리거트 루트로 잡았습니다.도메인 룰은 다음과 같습니다.Team 은 반드시 이름이 있어야한다.Player는 반드시 이름과 나이가 있어야한다.Player는 반드시 Team에 소속되어야하며, 하나의 Team 에만 소속될 수 있다.player 의 Team 은 변경될 수 없다.엔티티 코드 입니다. (연관관계 편의 메서드를 애그리거트 루트쪽에 두었습니다.)(두 엔티티는 동일한 패키지에 있습니다. package com.example.jpa.module.team.domain;)@Entity public class Team { @Id @GeneratedValue private Long teamNo; private String name; @OneToMany(mappedBy = "team", cascade = CascadeType.ALL) private List<Player> players = new ArrayList<>(); //생성자 public Team(String name) { this.name = name; } //연관관계 편의 메서드 public void addPlayer(Player player) { player.setTeam(this); this.players.add(player); } }@Entity public class Player { @Id @GeneratedValue private Long playerNo; private String name; private Integer age; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "team_no") private Team team; //생성자 public Player(String name, int age) { this.name = name; this.age = age; } void setTeam(Team team) { this.team = team; } }service 계층 코드입니다.Team team = new Team("team1"); Player player = new Player("kim", 24); team.addPlayer(player); teamRepository.save(team);Team 이 Player 를 완전히 소유하는 관계이기 때문에 애그리거트 루트를 Team 으로 잡았고 연관관계 메서드 또한 Team 에 있는게 자연스러워 보입니다.(예시가 Team-Player라 결합도가 좀 떨어지는것 처럼 느껴지는데 주문-주문항목 이나 게시글-첨부파일 같은 관계로 봐주시면 감사하겠습니다.)문제점연관관계 편의 메서드 addPlayer(..)가 호출되기 전까지 Player의 도메인 룰이 깨진 상태가 됩니다.도메인 룰 3번 "Player 는 반드시 Team에 소속되어야 한다" 를 위반하게 됩니다.Player의 setTeam(..) 메서드를 클래스 외부에 공개해야 합니다.같은 패키지라 public 으로 공개하진 않았지만 해당 메서드로 인해 도메인 룰 4번 "player 의 Team 은 변경될 수 없다." 를 위반할 여지가 생겼습니다.setTeam(..) 메서드에 this.team != null 인 경우 예외를 발생시켜 도메인 룰을 지킬 수 있지만 좋은 방법인지 잘 모르겠습니다..시도한 방법Player의 생성자에 Team을 받도록 합니다.public Player(Team team, String name, int age) { this.team = team; this.name = name; this.age = age; }근데 이렇게 하니 그냥 연관관계 편의 메서드를 Player에 두는게 나은것 같아 생성될때 연관관계를 맺도록 정적 팩토리 메서드를 작성했습니다.public static Player createAndLink(Team team, String name, int age) { Player player = new Player(team, name, age); //생성자 private 으로 변경 team.getPlayers().add(player); //반대편 연관관계 설정 return player; }일단 도메인 룰은 모두 만족하는 듯 보이나 service 계층 코드가 뭔가 부자연스럽습니다.Team team = new Team("team1"); Player player = Player.createAndLink(team, "kim", 24); teamRepository.save(team);위 코드를 보면 player를 생성하고 사용하지 않는것 처럼 보여 불필요한 코드로 인식됩니다.(인텔리제이에서도 player가 미사용 중이라고 나옵니다.)혹시 위와 같은 상황에서 어떻게 해결하는게 가장 좋은 방법일까요?(긴 글 읽어주셔서 감사합니다.)
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
주 테이블 외래키 장,단점에 관해 질문이 있습니다.
"주 테이블만 조회해도 대상 테이블에 데이터가 있는지 확인 가능" 이 부분을 저는 주 테이블만 봐도 일단 외래키가 있다는 것은 대상 테이블에 뭔가가 있다는 것이니까 대상 테이블의 데이터 존재 유무 확인이 가능하다 라고 이해를 하였고 "값이 없으면 외래 키에 null 허용" 이 부분을 저는 OneToOne 관계이므로 한 사람은 라커 하나를 사용할 수 있고 라커도 한 사람에게 할당될 수 있으므로 주 테이블의 외래키인 LOCKER_ID가 null 이라는 것은 이 사람에게 할당될 라커가 없고 고로 대상 테이블에도 데이터가 없다 라고 이해를 했습니다. 이런 상황에서 두 가지 질문이 있습니다.제가 이해한 것이 맞을까요?테이블 칼럼의 값이 null인 것이 왜 단점일까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
일대일 관계에서 주테이블과 대상테이블은 어떤 기준으로 나누나요?
다대일 관계에선 다(N)쪽이 외래키를 가지고 있으니까 그 쪽을 기준으로 생각하면 될 거 같은데, 일대일 관계에선 따로 기준이 있나요?
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
FK + 상수로 이루어진 조인
A 테이블에는A테이블의 PK 가 있고 B 테이블의 경우B 테이블 ID 컬럼(PK) , A테이블의 PK 값(FK) ,A테이블의 테이블명(상수)을 갖고있는 테이블이 있을때 A테이블과 B테이블과의 관계를엔티티 연관관계를 걸때 FK+A테이블의 테이블명(상수)(B테이블에는 FK+여러테이블명(A,C,D,E ...))으로 이루어진 다수의 ROW 존재 1줄로 요약하자면 FK + 상수 가 조인 조건일때이런경우 연관관계를 맺기 위한 정석적인 해결책이 있나요? 많은 구글링을 해보았지만1.https://stackoverflow.com/questions/28818511/jpa-hibernate-join-on-constant-value (@JoinColumnOrFormula)2.https://stackoverflow.com/questions/68341956/jpa-hibernate-how-to-define-custom-join-clause-on-entity(@JoinFormula)3.https://stackoverflow.com/questions/27945738/jpa-jointable-with-extra-join-conditions(@WhereJoinTable ) 4.https://stackoverflow.com/questions/30571450/jpa-many-to-one-with-constant-values-in-referenced-table@Where(clause=상수)5.혹은 연관관계를 맺지않고 별도쿼리로 처리 등등을 찾아보았지만맞는 방법이 무엇인지 잘 모르겠습니다.