2010-02-22 43 views
2

的JPA教程指出一个可具有非实体延伸实体类:延续实体(jpa)的非实体类 - 示例?

实体可以延伸两个实体和 非实体类和非实体 类可以延伸实体类。 - http://java.sun.com/javaee/5/docs/tutorial/doc/bnbqa.html

是否有可能坚持这样的结构?

我想这样做:

@Entity 
abstract class Test { ... } 

class FirstConcreteTest extends Test { ... } // Non-ntity 
class SecondConcreteTest extends Test { ... } // Non-entity 

Test test = new FirstConcreteTest(); 

em.persist(test); 

我想什么它做的是坚持映射的抽象测试到一个公共的数据库表的所有具体类(第一和第二)的所有领域,使所有第一个和第二个测试类的字段未被执行(这些可以包含像EJB,jdbc池等等)。

还有一个奖金问题。是否有可能坚持抽象财产?

@Entity 
abstract class Test { 

    @Column 
    @Access(AccessType.PROPERTY) 
    abstract public String getName(); 

} 

class SecondConcreteTest extends Test { 
    public String getName() { 
     return "Second Concrete Test"; 
    } 
} 

回答

2
+0

正如我在DataNucleus的评论中所说 - 我想避免用@Entity标记具体类,因为它们有很多。并且所有持续存在的信息已经可以通过抽象类获得。额外的具体类的注释增加了不必要的混乱,并且使得创建这些类变得更加困难(您必须记住要标记字段瞬变,添加@Entity,添加区分值等)。我想我会坚持Spring的SimpleJdbcInsert。谢谢,帕斯卡。 – 2010-02-23 10:16:21

2

再次阅读该链接。 “实体类必须遵循以下要求: *该类必须使用javax.persistence.Entity批注注释。”

如果一个类是一个非实体,那么它是一个非实体,因此不会作为一个实体持久化。任何持久化都必须标记为这样,因此将您的子类标记为实体,并将您不想保留的字段标记为“瞬态”。

+0

是的,但这正是我一直试图避免的 - 用@Entity标记具体测试类的超文本,它的字段为瞬态。但这还不是全部 - 我还需要添加@DiscriminatorValue(我在数据库中有一个区分列,但值不同于JPA默认值)。 但我开始认为这只是不合逻辑的。我只想插入数据,但JPA需要知道如何以相反的方式实例化类。对我而言,这可能是不可能的。至少只要我的超类是抽象的。 无论如何,感谢您的答案,DataNucleus。 – 2010-02-23 09:24:23