2017-11-21 9 views
1

私はSpringデータJPAで作業していますが、LocalDateTime(Java 8)として日付を取得しているエンティティを作成しました。 DBに格納中に実際の日付が格納されていない場合は、DBにバイナリ型の値を格納しています。LocalDateTimeがデータベースに格納されていません

DBでの使用中にLocalDateTimeを使用するかどうか、このJava 8の日付APIを使用する必要がない場合はどうすればよいですか。

エンティティファイル: -

import java.time.LocalDateTime; 

import javax.persistence.Column; 
import javax.persistence.EntityListeners; 
import javax.persistence.MappedSuperclass; 

import org.springframework.data.jpa.domain.support.AuditingEntityListener; 

import lombok.AllArgsConstructor; 
import lombok.Getter; 
import lombok.NoArgsConstructor; 
import lombok.Setter; 

/** 
* 
* @author Ravat 
* 
*/ 

@Getter 
@Setter 
@AllArgsConstructor 
@NoArgsConstructor 
@MappedSuperclass 
@EntityListeners(AuditingEntityListener.class) 
public abstract class BaseEntity { 

    //@CreatedDate 
    @Column(name = "created_date", updatable = false) 
    private LocalDateTime createdDate = LocalDateTime.now(); 

    //@LastModifiedDate 
    @Column(name = "updated_date") 
    private LocalDateTime updatedDate = LocalDateTime.now(); 

} 
+0

投稿したコード部分の実装方法。それは私たちが何が悪くなったのかを良く理解するのに役立ちます。 –

+0

代わりにjava.util.Dateを使用してください。 – cdaiga

+0

これはあなたが助けになるかもしれません:[休止状態でLocalTimeを保存する方法](https://stackoverflow.com/questions/43420970/how-to-store-localtime-in-hibernate/43421511) –

答えて

4

参考リンクHow to persist LocalDate and LocalDateTime with JPA

JPAが代わりにDATEまたはTIMESTAMPのBLOBにマップします。つまり、データベースは日付オブジェクトを認識せず、最適化を適用できません。それは私たちがやるべきことではない、あるいはやりたいことではありません。

ただし、これは、日付と時刻のAPIを使用できないことを意味するものではありません。サポートを追加する方法を決定するだけで済みます。

DATE列またはTIMESTAMP列のLocalDateTimeにLocalDate属性を格納する場合は、java.sql.Dateまたはjava.sql.Timestampへのマッピングを自分で定義する必要があります。

JPA 2.1のいくつかの新機能の1つである属性変換プログラムのおかげで、これはポストhereにある数行のコードで実現できます。

例えば、

@Converter(autoApply = true) 
public class LocalDateAttributeConverter implements 
AttributeConverter<LocalDate, Date> { 

@Override 
public Date convertToDatabaseColumn(LocalDate locDate) { 
    return (locDate == null ? null : Date.valueOf(locDate)); 
} 

@Override 
public LocalDate convertToEntityAttribute(Date sqlDate) { 
    return (sqlDate == null ? null : sqlDate.toLocalDate()); 
} 
} 

あなたはその二つの方法convertToDatabaseColumnとconvertToEntityAttributeとAttributeConverterインタフェースを実装する必要があります。メソッド名でわかるように、エンティティ属性のタイプ(LocalDate)からデータベースの列タイプ(Date)への変換を定義し、もう1つは逆変換を定義します。 java.sql.DateはLocalDateとの変換を行うメソッドを既に提供しているため、変換自体は非常に簡単です。

さらに、属性コンバーターに@Converterアノテーションを注釈する必要があります。オプションのautoApply = trueプロパティにより、コンバータはLocalDateタイプのすべての属性に適用されます

0

なぜあなたの唯一の目的は、なぜ春のタイムスタンプアノテーションを使用しないのかを監査することです。

public abstract class BaseEntity { 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Long id; 

@CreationTimestamp 
@CreatedDate 
@Temporal(TemporalType.TIMESTAMP) 
@Column(name = "create_date") 
private Date createdAt; 

@UpdateTimestamp 
@LastModifiedDate 
@Temporal(TemporalType.TIMESTAMP) 
@Column(name = "modify_date") 
private Date updatedAt; 
関連する問題