@Entity和@Embeddable之间的继承

时间:2012-09-26 08:42:54

标签: java database hibernate jpa

动机

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

1 个答案:

答案 0 :(得分:2)

您检查过注释@MappedSuperclass吗?这可能就是你要找的东西。

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

  

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

     

可以映射使用MappedSuperclass注释指定的类   以与实体相同的方式,但映射仅适用   因为映射的超类不存在表,所以它的子类   本身。当应用于子类时,继承的映射将会   在子类表的上下文中应用。映射信息可以   通过使用AttributeOverride和在这些子类中重写   AssociationOverride注释或相应的XML元素。