Hibernate-reactive: hibernate.jdbc.time_zone은 TIME μ—΄μ—μ„œ μ§€μ›λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

에 λ§Œλ“  2021λ…„ 06μ›” 14일  Β·  21μ½”λ©˜νŠΈ  Β·  좜처: hibernate/hibernate-reactive

μ•ˆλ…•ν•˜μ„Έμš”, <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:

ν™˜κ²½μ •λ³΄

  • 버전: 1.0.0.CR6
problem

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

신경쓰지 마.... μ˜ˆμ™Έκ°€ 보여

λͺ¨λ“  21 λŒ“κΈ€

이둠상 이미 μž‘λ™ν•΄μ•Ό ν•©λ‹ˆλ‹€ :-)
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μ™€μ˜ ν† λ‘  일뢀λ₯Ό μš”μ•½ν•˜μžλ©΄:

  1. κ·ΈλŠ” λͺ¨λ“  JDBC λ“œλΌμ΄λ²„κ°€ 깨지기 쉽고 λ‹€λ₯Έ μž‘μ—…μ„ μˆ˜ν–‰ν•˜κΈ° λ•Œλ¬Έμ— 이 λͺ¨λ“  것이 μ²˜μŒλΆ€ν„° ORMμ—μ„œ 맀우 μ·¨μ•½ν•˜κ³ (μ•„λ§ˆλ„ κ³ μž₯λ‚  수 μžˆλ‹€κ³ ) λ§ν•©λ‹ˆλ‹€.
  2. hibernate.jdbc.time_zone (주어진 Timestamp λ₯Ό Vert.x SQL ν΄λΌμ΄μ–ΈνŠΈμ— μ „λ‹¬ν•˜κΈ° 전에 주어진 μ‹œκ°„λŒ€λ‘œ λ³€ν™˜ν•˜λ €κ³  μ‹œλ„ν•¨)λ₯Ό μ‚¬μš©ν•˜μ—¬ Timestamp λ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ λ‚΄κ°€ κ²°μ •ν•œ 것은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. λ˜λŠ” κ°•λ ₯ν•˜μ§€ μ•Šμ„ μˆ˜λ„ μžˆμ§€λ§Œ Time 에 λŒ€ν•΄ κ°œλ…μ μœΌλ‘œ μ˜¬λ°”λ₯΄μ§€ μ•Šμ€ 것 κ°™μŠ΅λ‹ˆλ‹€.

λ”°λΌμ„œ μ˜΅μ…˜μ€ (1) 섀정을 쑰용히 λ¬΄μ‹œν•˜κ±°λ‚˜, (2) 섀정이 μžˆμ„ λ•Œ ν­νŒŒν•˜κ±°λ‚˜, (3) λ¬Έμ œκ°€ μžˆλŠ” κ²ƒμœΌλ‘œ μ•Œκ³  μžˆλŠ” μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

λ‚˜λŠ” (2)와 ν•¨κ»˜ 갈 의ν–₯이 μžˆλ‹€.

λ‚˜λŠ” _κ°€μ •_ μš°λ¦¬κ°€ ν˜„μž¬ λ‚ μ§œ μ‹œκ°„μ— ν•˜κ³  μžˆλŠ” 일을 계속할 수 있고 μ‹œκ°„μ— κ΄€ν•œ 섀정은 λ¬΄μ‹œν•  수 μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 이런, 그것은 이미 깨진 뢀뢄에 λŒ€ν•΄ μƒˆλ‘­κ³  λ‹€λ₯΄κ²Œ 깨진 해석을 λ„μž…ν•˜λŠ” 것과 κ°™μŠ΅λ‹ˆλ‹€. 브λ₯΄λ₯΄

@pqab 이 섀정을 μ •ν™•νžˆ μ‚¬μš©ν•˜λŠ” μ΄μœ λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ? ν•©λ¦¬μ μœΌλ‘œ, 예λ₯Ό λ“€μ–΄ 그것을 μ‚¬μš©ν•˜μ§€ _μ•Šμ„_ 수 μžˆμŠ΅λ‹ˆκΉŒ?

@pqab μ™œ 이 섀정을 _μ •ν™•ν•˜κ²Œ_ μ‚¬μš©ν•©λ‹ˆκΉŒ? ν•©λ¦¬μ μœΌλ‘œ, 예λ₯Ό λ“€μ–΄ 그것을 μ‚¬μš©ν•˜μ§€ _μ•Šμ„ 수 μžˆμŠ΅λ‹ˆκΉŒ?

@Ngosti2000에 λŒ€ν•œ λ™μΌν•œ 질문

κ³΅μ •ν•˜κ²Œ λ§ν•˜λ©΄ LocalTime 와 같은 μ‹œκ°„λŒ€κ°€ μ—†λŠ” κ°œμ²΄μ— μ μš©ν•  κ²ƒμœΌλ‘œ μ˜ˆμƒν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” 그것이 μ „μ—­ μ†μ„±μ΄λΌλŠ” 것이 문제라고 μƒκ°ν•˜κ³  λ‹€λ₯Έ κ²½μš°μ— 합리적이기 λ•Œλ¬Έμ— μ„€μ •ν•˜λ©΄ νŠΉμ • ν•„λ“œμ— λŒ€ν•΄ λΉ„ν™œμ„±ν™” ν•  μˆ˜μžˆλŠ” 방법이 μ—†λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. μ•„λ‹ˆλ©΄ μžˆμ„ 수 μžˆμŠ΅λ‹ˆκΉŒ?

κ³΅μ •ν•˜κ²Œ λ§ν•˜λ©΄ LocalTime 와 같은 μ‹œκ°„λŒ€κ°€ μ—†λŠ” κ°œμ²΄μ— μ μš©ν•  κ²ƒμœΌλ‘œ μ˜ˆμƒν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.

λ§žμ•„μš”. μš°λ¦¬λŠ” μ œμ •μ‹ μ„ λ„ˆλ¬΄ 많이 κ°€μ •ν–ˆμŠ΅λ‹ˆλ‹€.

νŠΉμ • ν•„λ“œμ— λŒ€ν•΄ λΉ„ν™œμ„±ν™”ν•˜λŠ” 방법이 μ—†λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. μ•„λ‹ˆλ©΄ μžˆμ„ 수 μžˆμŠ΅λ‹ˆκΉŒ?

λ‚΄κ°€ μ•„λŠ” ν•œμ—μ„œλŠ” μ•„λ‹ˆλ‹€.

λ‹€λ₯Έ DATE ν•„λ“œμ—λŠ” μ „μ—­ 속성이 ν•„μš”ν•˜μ§€λ§Œ TIME ν•„λ“œμ—λŠ” μ‹œκ°„λŒ€κ°€ μ—†κΈ° λ•Œλ¬Έμ— λ¬΄μ‹œλ˜μ–΄μ•Ό ν•œλ‹€κ³  μ˜ˆμƒν–ˆμŠ΅λ‹ˆλ‹€.

μ™„λ£Œ

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰