JPA - kdevkr/mambo-box GitHub Wiki
spring:
jpa:
show-sql: true
hibernate:
ddl-auto: none
properties:
hibernate:
boot.allow_jdbc_metadata_access: false
open-in-view: false
database-platform: org.hibernate.dialect.PostgreSQLDialect
datasource:
url: jdbc:postgresql://[hostname]:5432/[database]
hikari:
jdbc-url: ${spring.datasource.url}
username: [user]
password: [password]
ํ ์ด๋ธ์ ๋ง๋ค์ง ์๊ณ ๊ฐ๋จํ ์ฟผ๋ฆฌ๋ฅผ ํธ์ถํ๊ณ ์ถ์๋ (์, ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฒ์ ์กฐํ)
@PersistenceContext
EntityManager entityManager;
String version = entityManager.createQuery("SELECT version()", String.class).getSingleResult();
์ฌ์ฉ์์ ๋ํ ํ ๋ํธ ์์ด๋(u_grp_id)๋ฅผ ํจ๊ป ๊ฐ์ ธ์ค๊ณ ์ถ์ ๋ ์ฐธ์กฐ ํ ์ด๋ธ์ ๋ํ ์กฐ์ธ ํจ์น๋ฅผ ์ํด์๋ ์ํฐํฐ๋ก ๊ด๋ฆฌ๋์ด์ผํจ
@Data
@Entity
@Table(name = "\"user\"")
public class UserEntity {
@Id
@Column(name = "u_id")
private String uId;
private String id;
private String name;
private String language;
private String timeZone;
private String type;
private boolean del;
@JsonIgnore
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "u_id", referencedColumnName = "u_id", insertable = false, updatable = false)
private UserRel userRel;
public String getUGrpId() {
return userRel == null ? null : userRel.getUGrpId();
}
}
@Data
@IdClass(UserRel.ID.class)
@Entity
@Table(name = "user_rel")
public class UserRel {
@Id
@Column(name = "u_id")
private String uId;
@Id
@Column(name = "u_grp_id")
private String uGrpId;
@Data
public static class ID implements Serializable {
private String uGrpId;
private String uId;
}
}
org.springframework.dao.DataIntegrityViolationException: Could not extract column [7] from JDBC ResultSet [Bad value for type byte : SYSTEM] [n/a]; SQL [n/a]
...
Caused by: org.hibernate.exception.DataException: Could not extract column [7] from JDBC ResultSet [Bad value for type byte : SYSTEM] [n/a]
...
Caused by: org.postgresql.util.PSQLException: Bad value for type byte : SYSTEM
@Enumerated(EnumType.STRING) ๋๋ JPA Attribute Converter ๋ก ์๋ฐ Enum ์ DB ์ปฌ๋ผ๊ณผ ๋งคํํ ์ ์๋ค.
- @Enumerated(EnumType.STRING): Enum ๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋๋ ๊ฒฐ๊ณผ๊ฐ ๋์ผํ ๋
- Attribue Converter: Enum ๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋๋ ๊ฐ์ด ์ผ์นํ์ง ์๋ ๊ฒฝ์ฐ
@Enumerated(EnumType.STRING)
@JdbcType(PostgreSQLEnumJdbcType.class)
private UserType type;
public class UserEntity {
@JdbcTypeCode(SqlTypes.JSON)
private Metadata metadata;
@Data
public static class Metadata {
private String status;
@JsonAlias({"alarm_interval"})
private String alarmInterval;
}
}
EntityManager ๋๋ JdbcTemplate ๋ก ํ๋ก์์ ์ฝ ํธ์ถํ๊ธฐ...
์ ์ ๊ฐ๋ฐ์ ์ด๋ ฅ์์์ ์ฝ๊ฒ ๋ณผ ์ ์๋... JOIN ์ ์ํํ์ง ์๊ณ ์กฐํ ๋ชฉ๋ก์ ๋ํ ๊ฐ์ ๋งํผ ๊ฐ๋ณ ์กฐํ๋ฅผ ์ํํ๋ ๊ณผ์ , JPQL ๋ก Fetch Join์ ์ํํด์ผ ํ๋ค?
Hibernate: select ue1_0.u_id,ue1_0.created,ue1_0.del,ue1_0.id,ue1_0.language,ue1_0.last_login_time,ue1_0.name,ue1_0.time_zone,ue1_0.type from "user" ue1_0 offset ? rows fetch first ? rows only
Hibernate: select ur1_0.u_grp_id,ur1_0.u_id from user_rel ur1_0 where ur1_0.u_id=?
Hibernate: select ur1_0.u_grp_id,ur1_0.u_id from user_rel ur1_0 where ur1_0.u_id=?
Hibernate: select ur1_0.u_grp_id,ur1_0.u_id from user_rel ur1_0 where ur1_0.u_id=?
Hibernate: select ur1_0.u_grp_id,ur1_0.u_id from user_rel ur1_0 where ur1_0.u_id=?
Hibernate: select ur1_0.u_grp_id,ur1_0.u_id from user_rel ur1_0 where ur1_0.u_id=?
Hibernate: select ur1_0.u_grp_id,ur1_0.u_id from user_rel ur1_0 where ur1_0.u_id=?
Hibernate: select ur1_0.u_grp_id,ur1_0.u_id from user_rel ur1_0 where ur1_0.u_id=?
Hibernate: select ur1_0.u_grp_id,ur1_0.u_id from user_rel ur1_0 where ur1_0.u_id=?
Hibernate: select ur1_0.u_grp_id,ur1_0.u_id from user_rel ur1_0 where ur1_0.u_id=?
Hibernate: select ur1_0.u_grp_id,ur1_0.u_id from user_rel ur1_0 where ur1_0.u_id=?
Hibernate: select count(ue1_0.u_id) from "user" ue1_0
@Transactional(readOnly = true)
public interface UserEntityRepository extends JpaRepository<UserEntity, String> {
@Query("SELECT u FROM UserEntity u join fetch u.userRel")
Page<UserEntity> findAll(Pageable pageable);
}
Hibernate: select ue1_0.u_id,ue1_0.created,ue1_0.del,ue1_0.id,ue1_0.language,ue1_0.last_login_time,ue1_0.name,ue1_0.time_zone,ue1_0.type,ur1_0.u_grp_id,ur1_0.u_id from "user" ue1_0 join user_rel ur1_0 on ur1_0.u_id=ue1_0.u_id fetch first ? rows only
Hibernate: select count(ue1_0.u_id) from "user" ue1_0 join user_rel ur1_0 on ur1_0.u_id=ue1_0.u_id
@JdbcType(OffsetDateTimeJdbcType.class)
private OffsetDateTime createdAt;
@JdbcType(InstantJdbcType.class)
private Instant lastLoginTime;
- Timestamp with timezone ์ผ๋ก ๋ง๋ค์ด์ง๋ฉฐ long ์ Timestamp ์ปฌ๋ผ์ด ๋๋ค.