μλ
νμΈμ, <property name="hibernate.jdbc.time_zone" value="UTC"/>
μμ±μ μ ν리μΌμ΄μ
μ μΆκ°νλ €κ³ νμ§λ§ μΌλΆ MySQL TIME
μ΄μ $#$ UnsupportedOperationException
$#$κ° μμ΅λλ€. μ΄λ₯Ό μ§μν κ³νμ΄ μλμ§ μ μ μμ΅λκΉ?
java.lang.UnsupportedOperationException: null
at org.hibernate.reactive.adaptor.impl.PreparedStatementAdaptor.setTime(PreparedStatementAdaptor.java:246)
Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:
μ΄λ‘ μ μ΄λ―Έ μλν΄μΌ ν©λλ€ :-)
https://github.com/hibernate/hibernate-reactive/issues/667
λ΄κ° λ΄μ€κ²
μ¬μ© μ€μΈ μν°ν°μ μλ₯Ό μ§λμΉ μ μμ΅λκΉ? μ¬μμ°μ΄ λ μ’μ κ²μ λλ€. JBangμ μ¬μ©νμ¬ μμ ν μ€νΈ μΌμ΄μ€λ₯Ό μμν μ μμ΅λλ€.
jbang init -t mysql-reproducer@hibernate/hibernate-reactive Issue856.java
jbang edit --open=idea --live Issue856.java
idea
λ₯Ό μ’μνλ IDEλ‘ λ°κΏ μ μμ΅λλ€.
μ κ²½μ°μ§ λ§.... μμΈκ° 보μ¬
λ λ§μ μΈλΆ μ¬νμ μν΄ Entityμμ LocalTimeμ μ¬μ©νκ³ λ°μ΄ν°λ² μ΄μ€μμ TIMEμ μ¬μ©νκ³ μμ΅λλ€.
μ€μ¬
public class A {
@Column(name = "time")
private LocalTime time;
}
ν
μ΄λΈ
CREATE TABLE IF NOT EXISTS A (
time TIME
)
λ°λΌμ μ¬κΈ°μ λ¬Έμ λ ꡬμνλ _time_μ κ°λ μ΄ μμ ν κΉ¨μ Έ SQLμ λμ λμ΄μλ μ λλ€λ κ²μ λλ€(λ€ννλ λλΆλΆμ λ°μ΄ν°λ² μ΄μ€λ μ΄λ₯Ό μ§μνμ§ μμ΅λλ€). μκ°λ κ°μ 맀νμ _λ μ§μ λ°λΌ λ€λ₯΄λ―λ‘_ μκ°λκ° μ§μ λ λ μ§ μκ°λ§ μλ―Έκ° μμ΅λλ€.
μ§κΈκΉμ§ λλ hibernate.jdbc.time_zone
μ λμμ λν΄ μ ν λͺ°λμ΅λλ€. 첫λμ 보기μ κ½€ λλΉ λ³΄μκ³ μλ§λ H6μμ λ³κ²½ν΄μΌ ν κ²μ
λλ€.
κ·Έλμ μ¬κΈ°μ 무μμ ν΄μΌ ν μ§ μ λͺ¨λ₯΄κ² μ΅λλ€. ORMκ³Ό κ°μ λμ μΌμ νλλ‘ "μμ "νκ±°λ μκ°μΌλ‘ μμ ν λ μ€μ μ 무μνμκ² μ΅λκΉ?
μλλ©΄ μμ±μ μμ ν 무μνκ³ λμ μ°κ²° μμ±μ μ¬μ©νμ¬ μ΄ μμ μ μννλ λ°©λ²μ μμλ΄κ² μ΅λκΉ? (Vert.x ν΄λΌμ΄μΈνΈμ μλ‘μ΄ κΈ°λ₯μ΄ νμν μλ μμ§λ§ νμ€νμ§ μμ΅λλ€.)
"λ²κ·Έ" λΌλ²¨μ μ κ±°νκ² μ΅λλ€. μ‘΄ μκ°μ΄ μλνμ§ μλ κ²μ λ²κ·Έκ° μλλλ€. κ·Έκ²λ€μ _design_μ μν΄ λ§κ°μ‘μ΅λλ€.
(λ¬Όλ‘ μ΄κ²μ λ΄κ° #676μ ν λ λ κΉμ΄ νκ³ λ€μ§ μκ³ hibernate.jdbc.time_zone
μ λμμ λ¬Έμ λ₯Ό μμμ°¨λ¦° κ²μ λν λΆλΆμ μΈ λ΄ μλͺ»μ
λλ€.)
λλ μ¬κΈ°μ ν λ‘ μ μμνλ€.
μκ°λ κ°μ 맀νμ _λ μ§μ λ°λΌ λ€λ₯΄λ―λ‘_ μκ°λκ° μ§μ λ λ μ§ μκ°λ§ μλ―Έκ° μμ΅λλ€.
μ’μ, νμ§λ§ κ·Έλ€μ μκ°λκ° μ°κ²°λμ΄ μμ§ μκ³ λ³νμ΄ νμνμ§ μμ LocalTime
λ₯Ό μ μ₯νλ €κ³ ν©λλ€.
λ΄κ° λκ°λ₯Ό λμΉκ³ μμ΅λκΉ?
κ·Έλ¬λ κ·Έκ²μ μ΄ μμ±μ΄ νλ μΌμ΄ μλ κ² κ°μ΅λλ€. ORMμμλ μκ°λλ₯Ό μ¬λ¬Όμ 첨λΆν©λλ€.
μ μ΄λ λμκ²λ κ·Έλ κ² λ³΄μΈλ€. (λλ κ·Έ JDBC λ©μλμ μλ―Έλ₯Ό μμ ν μ΄ν΄ν μ μμλ€.)
ORMκ³Ό λμΌν λμ μΌμ νλλ‘ "μμ "
ORMμ΄ νλ μΌμ νμΈνκ³ λκ°μ΄ ν κ²μ΄λΌκ³ μκ°ν©λλ€. κ·Έκ²μ μλ§λ ORMμ μ΅μν μ¬μ©μλ€μ΄ μμν μ μλ λμμΌ κ²μ λλ€.
ORMμ΄ νλ μΌμ νμΈνκ³ λκ°μ΄ ν κ²μ΄λΌκ³ μκ°ν©λλ€.
ννννννννννννννννννννννννννννννννννννννννννν λ¬μ½€νμ¬λ¦μμ΄
ORMμ λ³Έμ§μ μΌλ‘ λ¬Έμνλμ§ μμ μλ―Έλ₯Ό κ°μ§ JDBC λ©μλλ₯Ό νΈμΆν©λλ€.
(κ·Έλ¦¬κ³ μλ§λ λͺ¨λ λ°μ΄ν°λ² μ΄μ€μμ λ€λ₯΄κ² μλν©λλ€.)
Zulip μμ @yrodiereμμ ν λ‘ μΌλΆλ₯Ό μμ½νμλ©΄:
hibernate.jdbc.time_zone
(μ£Όμ΄μ§ Timestamp
λ₯Ό Vert.x SQL ν΄λΌμ΄μΈνΈμ μ λ¬νκΈ° μ μ μ£Όμ΄μ§ μκ°λλ‘ λ³ννλ €κ³ μλν¨)λ₯Ό μ¬μ©νμ¬ Timestamp
λ₯Ό μ²λ¦¬νκΈ° μν΄ λ΄κ° κ²°μ ν κ²μ λ€μκ³Ό κ°μ΅λλ€. λλ κ°λ ₯νμ§ μμ μλ μμ§λ§ Time
μ λν΄ κ°λ
μ μΌλ‘ μ¬λ°λ₯΄μ§ μμ κ² κ°μ΅λλ€.λ°λΌμ μ΅μ μ (1) μ€μ μ μ‘°μ©ν 무μνκ±°λ, (2) μ€μ μ΄ μμ λ νννκ±°λ, (3) λ¬Έμ κ° μλ κ²μΌλ‘ μκ³ μλ μμ μ μννλ κ²μ λλ€.
λλ (2)μ ν¨κ» κ° μν₯μ΄ μλ€.
λλ _κ°μ _ μ°λ¦¬κ° νμ¬ λ μ§ μκ°μ νκ³ μλ μΌμ κ³μν μ μκ³ μκ°μ κ΄ν μ€μ μ 무μν μ μμ΅λλ€. κ·Έλ¬λ μ΄λ°, κ·Έκ²μ μ΄λ―Έ κΉ¨μ§ λΆλΆμ λν΄ μλ‘κ³ λ€λ₯΄κ² κΉ¨μ§ ν΄μμ λμ νλ κ²κ³Ό κ°μ΅λλ€. λΈλ₯΄λ₯΄
@pqab μ΄ μ€μ μ μ νν μ¬μ©νλ μ΄μ λ 무μμ λκΉ? ν©λ¦¬μ μΌλ‘, μλ₯Ό λ€μ΄ κ·Έκ²μ μ¬μ©νμ§ _μμ_ μ μμ΅λκΉ?
@pqab μ μ΄ μ€μ μ _μ ννκ²_ μ¬μ©ν©λκΉ? ν©λ¦¬μ μΌλ‘, μλ₯Ό λ€μ΄ κ·Έκ²μ μ¬μ©νμ§ _μμ μ μμ΅λκΉ?
@Ngosti2000μ λν λμΌν μ§λ¬Έ
곡μ νκ² λ§νλ©΄ LocalTime
μ κ°μ μκ°λκ° μλ κ°μ²΄μ μ μ©ν κ²μΌλ‘ μμνμ§ λͺ»νμ΅λλ€.
λλ κ·Έκ²μ΄ μ μ μμ±μ΄λΌλ κ²μ΄ λ¬Έμ λΌκ³ μκ°νκ³ λ€λ₯Έ κ²½μ°μ ν©λ¦¬μ μ΄κΈ° λλ¬Έμ μ€μ νλ©΄ νΉμ νλμ λν΄ λΉνμ±ν ν μμλ λ°©λ²μ΄ μλ€κ³ μκ°ν©λλ€. μλλ©΄ μμ μ μμ΅λκΉ?
곡μ νκ² λ§νλ©΄
LocalTime
μ κ°μ μκ°λκ° μλ κ°μ²΄μ μ μ©ν κ²μΌλ‘ μμνμ§ λͺ»νμ΅λλ€.
λ§μμ. μ°λ¦¬λ μ μ μ μ λ무 λ§μ΄ κ°μ νμ΅λλ€.
νΉμ νλμ λν΄ λΉνμ±ννλ λ°©λ²μ΄ μλ€κ³ μκ°ν©λλ€. μλλ©΄ μμ μ μμ΅λκΉ?
λ΄κ° μλ νμμλ μλλ€.
λ€λ₯Έ DATE
νλμλ μ μ μμ±μ΄ νμνμ§λ§ TIME
νλμλ μκ°λκ° μκΈ° λλ¬Έμ 무μλμ΄μΌ νλ€κ³ μμνμ΅λλ€.
μλ£
κ°μ₯ μ μ©ν λκΈ
μ κ²½μ°μ§ λ§.... μμΈκ° 보μ¬