프로젝트 생성, 디펜던시 저 세개 추가하기
root계정에서 스키마 새로 만들어주기 => 이거 localhost에서 진행하기
아이디 ; demo_jpa / 비번 ; 늘쓰던애..
- 특권 설정 들어가서 특권 all 선택
- 커넥션 만들기
- 그리고 이와 같은 새로운 mysql 아이 만들기
=> mybatis 사용할 때는 테이블 값 미리 지정해뒀어야 하는데 jpa는 알아서 작성ㅇ
위와 같이 spring 파일 만들어주기
application.yml
파일 작성
spring:
datasource:
driver-class-name:com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.01:3306/demo_jpa_scheme
username : demo_jpa
passsword : qpqpqp0614@
jpa :
hibernate :
ddl-auto : create
show-sql : false
properties :
hibernate :
dialect:org.hibernate.dialect.MYSQL8DiaLect
위에거 잘못됐고 아래처럼 jpa앞에 indentation 있었어야 함 ^^..
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/demo_jpa_scheme?serverTimezone=UT
username : demo_jpa
passsword : qpqpqp0614
jpa :
hibernate :
ddl-auto : create
show-sql : false
properties :
hibernate :
dialect: org.hibernate.dialect.MYSQL8Dialect
=> 복습 설명 : jpa는 annotation들의 라이브러리, 이걸 사용하는 건 하이버네이트
PostEntity
클래스 작성@Entity
public class PostEntity {
@Id //jpa에게 아래의 아이기 pk라는 것임을 알려주는 것
private Long id;
//jpa 사용하면 프리미티브 타입 말고 클래스 기반 오브젝트 사용
private String title;
private String content;
private String writer;
}
그리고 밑에 작성한 수많은 에러들을 거친 채^^ run을 해주니
이렇게 잘 생기게 된다!
package jsbdy.jpa.entity;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
/*
id int
name varchar
*/
@Entity
public class BoardEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
}
/*boarentity와의 관계 명시를 위해 추가*/
@ManyToOne(
/*어떠한 관계를 대상으로 관계맺나?*/
targetEntity = BoardEntity.class,
fetch = FetchType.LAZY
) /*다대일관계*/
private BoardEntity boardentity;
/* 여러개의 post,게시글은 한개의 board,게시판에 소속돼있는 것*/
@OneToMany(
targetEntity = PostEntity.class,
fetch = FetchType.LAZY,
mappedBy = "boardentity"
/*PostEntity에 정의된 BoardEntity의 이름*/
)
private List<PostEntity> postentitylist = new ArrayList<>();
package jsbdy.jpa.repository;
import jsbdy.jpa.entity.BoardEntity;
import org.springframework.data.repository.CrudRepository;
/*
T : 이 레포지토리가 어떤 엔티티 위한 것인지
ID : 아이디가 어떤 타입으로 작성이 되는지
*/
public interface BoardRepository extends CrudRepository<BoardEntity,Long> {
}
(+) CRUDRepository
방금 만든 아이가 잘 생성됐음을 잘 알 수 있삼
@Component
public class TestComponent {
public TestComponent(
@Autowired BoardRepository boardrepository
){
BoardEntity boardentity = new BoardEntity();
boardentity.setName("new board");
BoardEntity newboardentity = boardrepository.save(boardentity);
System.out.println(newboardentity.getName());
}
}
package jsbdy.jpa.repository;
import jsbdy.jpa.entity.PostEntity;
import org.springframework.data.repository.CrudRepository;
public interface PostRepository extends CrudRepository<PostEntity, Long> {
}
=> 이제 postentity 사용 가눙
@Component
public class TestComponent {
public TestComponent(
@Autowired BoardRepository boardrepository,
PostRepository postrepository
){
BoardEntity boardentity = new BoardEntity();
boardentity.setName("new board");
BoardEntity newboardentity = boardrepository.save(boardentity);
PostEntity postentity = new PostEntity();
postentity.setWriter("hello ORM");
postentity.setContent("created by Hibernate");
postentity.setWriter("jsbdy");
postentity.setBoardentity(newboardentity);//save되고 난 후의 entity 지정
PostEntity newpostentity = postrepository.save(postentity);
}
}
일단 디폴드로 주어지는 것으로는 findById가 있어 근데 작성자로 찾는 것은 안됨?
PostRepository
가서 아래와 같이 리스트
public interface PostRepository extends CrudRepository<PostEntity, Long> {
List<PostEntity> findAllByWriter(String writer);
}
TestComponent
가서 아래와 같이 추가
System.out.println(postrepository.findAllByWriter("jsbdy").size());
List <PostEntity> findAllByWriterAndBoardEntity(String writer, BoardEntity entity);
List <PostEntity> findAllByWriterContatining(String writer);
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity{ //추상 클래스로 만들기
@CreatedDate
@Column(updatable=false)
private Instant createdAt;
@LastModifiedDate
@Column(updatable = true)
private Instant updatedAt;
PostEntity
@Table(name="post")
@ManyToOne(
/*어떠한 관계를 대상으로 관계맺나?*/
targetEntity = BoardEntity.class,
fetch = FetchType.LAZY
) /*다대일관계*/
@JoinColumn(name="board_id")
BoardEntity
에서도 아래 추가
- @Entity밑에 추가
@Table(name="board")
- @Column(name="board_name") 아래에 추가
private String name;
Before
mysql 컬럼에 잘 추가되고 반영됨 ㅇㅇ
(1) 해결참고블로그
at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35) ~[hibernate-core-5.4.33.jar:5.4.33] at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:101) ~[hibernate-core-5.4.33.jar:5.4.33] at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) ~[hibernate-core-5.4.33.jar:5.4.33] ... 33 common frames omitted
Process finished with exit code 1
(2) 해결참고블로그
/example?serverTimezone=UTC&characterEncoding=UTF-8 이걸 뒤에 추가
Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.service.spi.ServiceException: Unable to create requested service
Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(
Spring Boot
[Spring Boot] Hibernate 사용 시 Error creating bean with name 'entityManagerFactory' 해결 블로그
(3)
Unable to load class https://www.leawy.com/thread/hibernate-core-and-annotations/7792/java-lang-classnotfoundexception-could-not-load-requested-class-org-hibernate-mysql8dialect.htm
(4)
Access denied for user 'demo_jpa'@'localhost' (using password: NO)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(
https://stackoverflow.com/questions/2995054/access-denied-for-user-rootlocalhost-using-passwordno
https://www.yawintutor.com/error-5068-unable-to-open-jdbc-connection-for-ddl/
mysql> use mysql;
Database changed
mysql> select * from user;
아래처럼 쳐서 demo_jpa라는 아이를 살펴보았더니 N 천국 ^^ 권한없음 천국~~
mysql> create user 'demo_jpa'@'localhost';
Query OK, 0 rows affected (0.04 sec)
mysql> grant all privileges on . to 'demo_jpa'@'localhost';
Query OK, 0 rows affected (0.04 sec)
flush privileges;
Query OK, 0 rows affected (0.03 sec)
(5) jpa find~함수 작성 시 엔티티 명, 레포지토리 명 (소대문자 구별하는 것) 아주 중요!
List <PostEntity> findAllByWriterAndBoardEntity(String writer, BoardEntity entity);
라고 처음에 작성했는데, 나같은 경우에는 PostEntity에서 BoardEntity를 정의할 때
private BoardEntity boardentity;
이렇게 정의했었음 근데 jpa에서
findAllByWriterAndBoardEntity
이렇게 썼더니에러가 남 당연함
저렇게 쓰면 jpa는 boardEntity를 찾을텐데 나는 boardentity라고 정의해놨으니.. 따라서 아래처럼 수정하면 잘 됨ㅋ
List <PostEntity> findAllByWriterAndBoardentity