1

我有一堂课

@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 时出现问题class MyStringProperty extends MyAbstractProperty<String>{}

我了解到,默认情况下休眠只存储最多 255 个字符的字符串(请参阅:JPA:“列的数据太长”不会改变)。因此我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<>.
}

我如何确保这一点,因为默认值已经在 中定义MyAbstractProperty?我不认为将类型注释移动到是可以的,MyAbstractProperty因为这可能会对其他类(如MyLongProperty.

例如,当我@LobMyAbstractPropertySQL 定义中MyStringProperty设置 includeDEFAULTVALUE BLOB(255)而不是DEFAULTVALUE BIGINT.

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

编辑

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

我有一个替代方案 - 尚未完成 - 想法,这可能会导致对我的代码的修改更少。是否可以定义一个类

class MyText extendes String; 

例如所有实例MyText都自动存储为@Lob?比我只需要修改MyAbstractProperty<String>MyAbstractProperty<MyText>.

4

1 回答 1

3

您可以在超类中仅保留一个抽象 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;
    }
}
于 2017-03-02T21:19:06.563 回答