Tôi đã tìm thấy một giải pháp khác cho phép không mã hóa đoạn mã định nghĩa cột MySQL trong @Column
của bạn chú thích. Xác định phương ngữ ngủ đông của riêng bạn bằng cách ghi đè org.hibernate.dialect.MySQLDialect
:
package org.yourproject;
import java.sql.Types;
import org.hibernate.dialect.MySQL5Dialect;
public class MySQL564PlusDialect extends MySQL5Dialect {
public MySQL564PlusDialect() {
super();
registerColumnType( Types.TIMESTAMP, 6, "datetime($l)" );
}
}
và chỉ định nó là thuộc tính ngủ đông hibernate.dialect=org.yourproject.MySQL564PlusDialect
(phương ngữ bạn muốn mở rộng có thể khác nhau, ví dụ:org.hibernate.dialect.MySQL5InnoDBDialect
thay vào đó).
Giờ đây, bạn có thể điều chỉnh độ chính xác của DATETIME
của mình từ bên trong @Column
chú thích bằng cách sử dụng length
thuộc tính:
@Basic(optional=false)
@Column(name="moment", length=3)
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime")
public DateTime getMoment() {
...
sẽ tạo ra DATETIME(3)
định nghĩa cột có nghĩa là độ chính xác mili giây. Nếu bạn cần DATETIME
đơn giản (không có phân số giây), chỉ cần không chỉ định độ dài. Bạn có thể sử dụng giá trị của length
lên đến 6, có nghĩa là độ chính xác đến từng micro giây.
Nếu bạn tình cờ sử dụng phương ngữ khác với phương ngữ ở trên (ví dụ:org.hibernate.dialect.MySQLDialect
hoặc có thể một số cơ sở dữ liệu khác), điều đó sẽ không phá vỡ mã của bạn:length
thuộc tính trên @Column
sẽ bị bỏ qua.
P.S. Sẽ hợp lý hơn nếu khai thác precision
thuộc tính của @Column
thay vì length
, nhưng đơn giản thay thế "datetime($l)"
mẫu với "datetime($p)"
một trong cách triển khai phương ngữ của riêng tôi không hoạt động thuận lợi.