动机
我的应用程序根据表foo的内容向某些Web服务发出请求。我想记录那些请求(在数据库中)以及用于制作它们的foo行的值。仍然,由于表foo中的数据可能会随着时间的推移而变化,我需要记录行的确切内容(而不是其id)。我正在使用Hibernate所以我想,我可以在表示请求的实体中嵌入foo行。为了拥有干净的类层次结构,我希望有这样的东西:
class Foo
{
/*
* Here goes some properties of Foo, which specify columns names etc.
*/
}
@Embeddable
class EmbeddableFoo extends Foo
{
//EmbeddableFoo should have the same properties as Foo
}
@Entity
class EntityFoo extends Foo
{
@Id
Long getId() { //EntityFoo has some id }
//EntityFoo should have the same properties as Foo, except that
//it has id
}
问题
这不起作用,因为 EmbeddableFoo 不会看到 Foo 的属性。我可以在 Foo 上添加 @Inheritance 注释,以便 EntityFoo *看到 Foo 的*属性,但它会用 EmbeddableFoo
解决我的问题问题
是否容易(即不需要编写大量冗余代码)方法让 @Embeddable 和@ Entity *从同一个类继承?
答案 0 :(得分:2)
您检查过注释@MappedSuperclass
吗?这可能就是你要找的东西。
http://docs.oracle.com/javaee/5/api/javax/persistence/MappedSuperclass.html
指定一个其映射信息应用于的类 从中继承的实体。映射的超类没有单独的 为它定义的表。
可以映射使用MappedSuperclass注释指定的类 以与实体相同的方式,但映射仅适用 因为映射的超类不存在表,所以它的子类 本身。当应用于子类时,继承的映射将会 在子类表的上下文中应用。映射信息可以 通过使用AttributeOverride和在这些子类中重写 AssociationOverride注释或相应的XML元素。