如何将LocalDate作为Date类型保存到Hibernate中

时间:2017-02-11 16:49:09

标签: java hibernate jpa orm

我希望将LocalDate作为Hibernate类型保留在Date中,但即使在Hibernate文档中也无法找到它。我曾尝试过一次,但它存储为blob类型。

这是我的Ticket实体:

  <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
         "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
        <hibernate-mapping package="com.clustertech.entity">

   <class name="Ticket"  table="ticket">
    <id name="id" type="int" column="id">
        <generator class="native" />
    </id>
    <property name="date" column="tb_date" type="date"  length="35"/> 
    <property name="topic" column="tb_topic" type="string" length="35"/>
    <property name="subject" column="tb_subject" type="string" length="35"/>
    <property name="status" column="tb_status" type="string" length="35"/>
    <property name="message" column="tb_message" type="string"     length="255"/>

    <many-to-one name="person" column="person_id"/>

      </class>
  </hibernate-mapping>

这是我的班级实体:

public class Ticket implements Comparable<Ticket> {

   private int id;
   private LocalDate date;
   private String topic;
   private String Subject;
   private String message;
   private String status;
   private Person person;
}

它将getter和setter作为普通的POJO类。我在其他网站上看到过一种方法,但他们正在使用anotations。我想要类似的东西,但我没有使用正常的POJO类和hbm.xml文件的anotations。我非常确定我必须创建另一个类才能将LocalDate转换为Date,但我不知道如何将该类与我的实体相关联。

4 个答案:

答案 0 :(得分:1)

你必须创建一个转换器:

@Converter
public class MyConverter implements AttributeConverter<LocalDate, Date> {

    @Override
    public Date convertToDatabaseColumn(LocalDate localDate) {
        if(localDate == null){
            return null;
        }

        return Date.valueOf(localDate);
    }

    @Override
    public LocalDate convertToEntityAttribute(Date date) {
        if(date == null){
            return null;
        }

        return date.toLocalDate();
    }
}

然后在您的hbm.xml文件中添加转换器作为该属性的类型:

<property name="date" column="tb_date" type="date"/>
<convert converter="com.mypkg.MyConverter" attribute-name="date"/>

答案 1 :(得分:0)

尝试一下:

<property name="date" column="tb_date" type="LocalDate" /> 

请参见hibernate 5.2 user guide中的表2 Java 8基本类型。

答案 2 :(得分:0)

(我不是说英语的人)

我使用Hibernate 5.4,并且找到了解决此问题的方法,这很容易。

您只需将属性的类型更改为<?xml version="1.0" encoding="utf-8"?> <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/item_col_top" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".item.ItemActivity"> <com.google.android.material.appbar.AppBarLayout android:layout_height="wrap_content" android:layout_width="match_parent" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> <include android:id="@+id/item_toolbar" layout="@layout/toolbar" /> </com.google.android.material.appbar.AppBarLayout> <androidx.recyclerview.widget.RecyclerView android:id="@+id/item_rv" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="60dp" android:layout_marginTop="8dp" tools:listitem="@layout/list_item" app:layout_behavior="@string/appbar_scrolling_view_behavior"/> <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/item_cl_add" android:layout_width="match_parent" android:layout_height="wrap_content" android:fitsSystemWindows="true" app:layout_dodgeInsetEdges="bottom" android:layout_gravity="bottom"> <AutoCompleteTextView android:id="@+id/item_ac_add" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginTop="8dp" android:layout_marginBottom="8dp" android:hint="@string/item_edit_text_hint" android:imeOptions="actionDone" android:inputType="text" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@+id/item_b_add" app:layout_constraintTop_toTopOf="parent" tools:targetApi="o" /> <Button android:id="@+id/item_b_add" android:layout_width="42dp" android:layout_height="42dp" android:layout_marginStart="8dp" android:background="@color/colorForeground" android:stateListAnimator="@null" android:text="+" android:textColor="@android:color/black" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>

这也适用于LocalDateTime,您只需将类型更改为org.hibernate.type.LocalDateType

对于其他任何类型,您都应考虑查看org.hibernate.type.LocalDateTimeType

答案 3 :(得分:0)

尽管该帖子非常老,但是如果有人尝试在hbm中将hibernate与LocalDate结合使用,则仍会回复。为了使用@Maciej Kowalski编写的转换器,应使用hibernate docs示例28中指出的hbm文件中的以下条目。AttributeConverter的HBM映射“要使用HBM配置文件映射MoneyConverter,您需要使用转换后的: :属性元素的type属性中的前缀。”

<property name="birthDate" column="birth_date"
                  type="converted::com.mypkg.LocalDateConverter"/>