我希望将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
,但我不知道如何将该类与我的实体相关联。
答案 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"/>