我正在定义一个只为用户存储文档对象的实体。有时对象是二进制 (BLOB),例如 PNG 或 JPG 图像,有时它是基于字符的,例如 RTF 文本文件或 MIME text/* 类型。所有文档在同一个名称空间中都有一个唯一的 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的表。有没有办法让它们成为同一列?
还是我应该关心?拥有两列(类的每个实例中只使用其中一列)的空间需求是否最小?
还是我应该采取完全不同的方法?我愿意接受建议,因为我还没有花太多时间编写这个。