我写了一个属性转换器。我想在一个实体中应用它。到目前为止,我遵循纯粹的XML方法。
我在 hbm 表示法中找不到等效的@Convert
。
一个例子将不胜感激。
当我搜索此内容时,可以理解的是,Google会在"自动将hbm文件转换为实体,以及#34;自动将hbm文件转换为实体时返回大量有关工具/方法的结果。
修改 现在我怀疑hbm文件中是否有选项,因为这是JPA注释。
@Convert
的文件说:
转换注释用于指定Basic的转换 场地或财产。没有必要使用Basic注释或 相应的XML元素指定基本类型。
我不完全确定这意味着什么。在这种情况下,混合注释和XML是一种方法吗?
我试过这个:
public class Person {
//this is enum
private Ethnicity ethnicity;
//.....
}
public enum Ethnicity{
INDIAN("IND"),
PERSIAN("PER")
//...constructors and value field.
public String value(){
return this.value;
}
public Ethnicity fromValue(String value){
//logic for conversion
}
}
转换器:
@Converter
public class EthnicityConverter implements AttributeConverter<Ethnicity,String> {
@Override
public Ethnicity convertToEntityAttribute(String attribute) {
if ( attribute == null ) {
return null;
}
return Ethnicity.fromValue( attribute );
}
@Override
public String convertToDatabaseColumn(Ethnicity dbData) {
if ( dbData == null ) {
return null;
}
return dbData.value();
}
}
HBM文件:
//....other columns
<property name="ethnicity">
<column name="ethnicity"/>
<type name="EthnicityConverter"/>
</property>
//....other columns
修改:更正了转换器代码。
答案 0 :(得分:3)
Sarvana的答案很接近 - 事实上你确实使用了type
XML属性。但是,type
用于命名Hibernate Type
。但是,有一个约定命名为AttributeConverter - 只需将前缀converted::
应用于AttributeConverter FQN即可。例如,
<property name="ethnicity">
<column name="ethnicity"/>
<type name="converted::EthnicityConverter"/>
</property>
另一种选择是自动应用转换器:
@Converter( autoApply=true)
public class EthnicityConverter implements AttributeConverter<Ethnicity,String> {
...
}
鉴于上面的转换器,只要Hibernate知道它,Hibernate就会将其应用于Ethnicity
类型的任何属性。
HTH
答案 1 :(得分:1)
type
是Convert
注释的等效xml属性。
下面是转换为DB中的Y / N和实体中的布尔值。
<property name="status" column="book_status" type="yes_no" not-null="true"/>
只需将yes_no
替换为您的自定义converter
类
请参阅我的回答 https://stackoverflow.com/a/37914271/3344829
官方文件 https://docs.jboss.org/hibernate/orm/4.2/manual/en-US/html/ch06.html
<强>更新强>
<property name="ethnicity" column="ethnicity" type="com.example.EthnicityConverter"/>
<强>更新强>
@Converter
public class EthnicityConverter implements AttributeConverter<Ethnicity, String> {
@Override
public String convertToDatabaseColumn(Ethnicity attribute) {
// TODO return String value of enum
}
@Override
public Ethnicity convertToEntityAttribute(String dbData) {
// TODO return resolved enum from string
}
}
答案 2 :(得分:0)
我也不得不面对这个问题,而且我能够解决它。
参考:Hibernate 5 Documentation示例33. AttributeConverter的HBM映射
我们必须对包使用确切的类。
Ex:
sleep