Hibernate Annotations:将int存储在varchar列中

时间:2011-02-24 00:53:29

标签: hibernate hibernate-annotations

我正在使用Hibernate Annotations。

在我的POJO中,我有一个年份字段,这是一个int。

我想将此值保存在我的数据库中的char(4)列中,并且hibernate来回转换类型。无论如何我可以轻松地做到这一点(我开始研究@Type注释,但如果可能的话,我不想写自己的自定义类型)?

2 个答案:

答案 0 :(得分:6)

如果映射到DB的char(4)列的POJO字段是属性访问的,那么hibernate将调用其setter和getter来获取数据库和POJO之间的映射。因此,转换逻辑可以在该属性的setter和getter内实现。此外,intDate应标记为@Transient,告诉hibernate忽略映射此字段。

public class TableABC {

    private int id;
    private int intDate;

    @Id
    @GeneratedValue
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @Column(length=4) 
    private  String getCharDate() {
        return String.valueOf(this.intDate);
    }

    private void setCharDate(String charDate) {
        try {
            this.intDate = Integer.parseInt(charDate);
        } catch (NumberFormatException e) {
            //Logic to handle when charDate cannot convert to integer 
            this.intDate = 0;
        }
    }

    @Transient
    public int getIntDate() {
        return intDate;
    }

    public void setIntDate(int intDate) {
        this.intDate = intDate;
    }

}

答案 1 :(得分:1)

我快速搜索了Hibernate源代码,我认为没有一种类型可以用于此:

https://github.com/hibernate/hibernate-core/tree/master/hibernate-core/src/main/java/org/hibernate/type

但是我鼓励你实现你自己的Type(也许是Year类型?),因为它并不像听起来那么困难: - )

另一个解决方案是处理你的setter中的转换,也是一个选项,但如果没有大量的测试和性能测量,我就不会这样做。