2

动机

我的应用程序根据表 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* 从同一个类继承?

4

1 回答 1

2

你检查注释了@MappedSuperclass吗?这可能就是你要找的。

http://docs.oracle.com/javaee/5/api/javax/persistence/MappedSuperclass.html

指定一个类,其映射信息应用于从它继承的实体。映射的超类没有为其定义单独的表。

使用 MappedSuperclass 注释指定的类可以以与实体相同的方式映射,除了映射将仅应用于其子类,因为映射的超类本身不存在表。当应用于子类时,继承的映射将应用于子类表的上下文中。通过使用 AttributeOverride 和 AssociationOverride 注释或相应的 XML 元素,可以在此类子类中覆盖映射信息。

于 2012-09-26T08:55:59.500 回答