Hibernate:继承对Column的附加注释

时间:2017-02-27 17:20:46

标签: java hibernate jpa inheritance longtext

我有一个班级

canvas.delete(canvas.find_closest(x, y, halo=5))

这是@MappedSuperclass public abstract class MyAbstractProperty <T extends Object>{ @Id @GeneratedValue(strategy = GenerationType.TABLE) private Long id; @Column(name="defaultValue") protected T defaultValue; //... } 等子类的基础。 这很好用。当我想在课程class MyLongProperty extends MyAbstractProperty<Long>{}中存储Text时会出现问题。

我已经了解到,默认情况下,hibernate只存储最多255个字符的字符串(参见:JPA: "Data too long for column" does not change)。因此,我的class MyStringProperty extends MyAbstractProperty<String>{}需要一个额外的注释,如:

defaultValue

我如何确保这一点,因为@Entity class MyStringProperty extends MyAbstractProperty<String>{ @Type(type="org.hibernate.type.StringClobType") @Column(name="defaultValue") protected String defaultValue; // problem since defaultValue is already defined in MyAbstractProperty<>. } 已经定义了defaultvalue?我不认为将类型注释移动到MyAbstractProperty是可以的,因为这可能会对MyAbstractProperty等其他类产生副作用。

例如,当我在MyLongProperty中设置@Lob时,MyAbstractProperty的SQL定义包含MyStringProperty而不是DEFAULTVALUE BLOB(255)

其他问题:将列定义为文本数据似乎有不同的选项(例如DEFAULTVALUE BIGINT@Type(type="org.hibernate.type.StringClobType"))这些选项的主要区别在哪里。最好采取什么。 (我的主要数据库是HyperSQL,但我也针对SQLite,MariaDB和MySQL)。

修改

根据最近的反馈,似乎解决方案可能是抽象的getter / setter。我必须检查对我的代码有什么影响。

我有一个替代 - 没有完成 - 的想法,这可能会导致我的代码修改较少。是否可以定义一个类

@Lob

例如class MyText extendes String; 的所有实例都自动存储为MyText? 我只需将@Lob修改为MyAbstractProperty<String>

1 个答案:

答案 0 :(得分:2)

您只能在超类中留下一个抽象的getter,并在子类中定义该字段:

@MappedSuperclass
public abstract class MyAbstractProperty<T extends Object>{

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

    public abstract T getDefaultValue();
}

@Entity
class MyStringProperty extends MyAbstractProperty<String>{

    @Type(type="org.hibernate.type.StringClobType")
    @Column(name="defaultValue")
    protected String defaultValue;

    @Override
    public String getDefaultValue() {
        return defaultValue;
    }
}

为了避免对所有其他不需要特殊处理的情况进行样板处理,您可以简单地创建另一个包含默认映射的抽象类,然后从中扩展其他实体:

@MappedSuperclass
public abstract class MyDefaultProperty<T> extends MyAbstractProperty<T extends Object> {

    @Column(name="defaultValue")
    protected T defaultValue;

    @Override
    public T getDefaultValue() {
        return defaultValue;
    }
}