我正在定义一个只为用户存储文档对象的实体。有时对象是二进制(BLOB),例如PNG或JPG图像,有时它是基于字符的,例如RTF文本文件或MIME文本/ *类型。所有文档在同一名称空间中都有唯一的ID。这些属性大致如下:
@Id private long id;
@Column private String type;
@Lob private byte [] rawData;
现在我可以提供一些可以根据需要将rawData从byte []转换为String的访问器方法,但是有一种技术可以避免在字符数据的情况下频繁转换步骤吗?请注意,我不希望JPA提供程序也这样做 - 我希望使用一个表列来存储字符数据或二进制数据,当它被注入实体实例时,其转录开销很小或没有。
我想我应该能够编写一个基类和两个子类,如下所示:
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "TYPE", discriminatorType = DiscriminatorType.STRING)
public class Document {
@Id private long id;
@Column private String type;
}
@Entity
@DiscriminatorValue("binary")
public class BinaryDocument extends Document {
@Column @Lob private byte [] binaryData;
}
@Entity
@DiscriminatorValue("text")
public class TextDocument extends Document {
@Column @Lob private String textData;
}
(为简洁省略了存取方法)
如果我理解这一点,我最终会得到一张包含两个@Lob列的表格, binaryData 和 textData 。有没有办法让它们成为同一列?
或者我应该关心?具有两列(在类的每个实例中只使用其中一列)的空间要求是否最小?
或者我应该采取完全不同的方法?我很乐意接受建议,因为我还没有花太多时间来编码。