【问题标题】:dao, tx, service structure: where to place a method querying an abstract entity?dao、tx、服务结构:在哪里放置查询抽象实体的方法?
【发布时间】:2012-03-08 16:03:33
【问题描述】:

我有一个抽象实体,其他 4 个实体继承自该实体。这种关系运作良好,但是我想查询抽象实体,以便获得所有实体,而不管它们的类型如何。我不知道在哪里放置这样的方法,因为父实体 dao 也是抽象的。

EntityParent (abstract) -> EntityType1, EntityType2, EntityType3, EntityType4

DAO 如下所示:

EntityParentDAO(抽象)-> EntityType1DAO、EntityType2DAO、EntityType3DAO、EntityType4DAO

TX 也是这样的: EntityParentTx(抽象)-> EntityType1Tx、EntityType2Tx、EntityType3Tx、EntityType4Tx

我的项目结构如下: 实体 -> 每个实体的 DAO -> 每个 DAO 的 TX -> 组合多个 TX 的服务

Service 使用了我项目范围内的所有 *TX*。这是应该放置标准/HQL 查询的地方吗?这听起来不太对。

例如,假设我有一个 Car 父实体,并且我有子实体 CoupeSedanMinivan 等等,我想要一个汽车列表,给定一个所有人共有的属性因此在实体(及其表)Car 中。考虑到我遵循的结构,我会将这个查询/方法放在哪里?

【问题讨论】:

    标签: java spring hibernate jpa


    【解决方案1】:

    我不确定我是否遵循事务继承,但为什么不将父 dao 具体化并添加到那里呢?只要父级是一个实体,并且它有字段,你就可以查询它。返回类型将是基本类型的列表,但它将是实际类型的实例。

    例如:

    @Entity
    @Table(name = "table")
    @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
    @DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.INTEGER)
    public abstract class ParentImpl implements Parent{}
    
    @Entity
    @DiscriminatorValue("1")
    public class Entity1Impl extends ParentImpl {}
    
    public interface AbstractDao<T extends Parent> {}
    
    public interface ConcreteParentDao<Parent> {}
    

    【讨论】:

    • 在删除我的父 dao 和我的父 TX 的抽象部分后,我得到:Caused by: java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class 在我的抽象 dao(父 dao 继承自)和我的 EntityParentDAO。
    • 您可以离开抽象父级,并为它创建一个具体的实现(抽象->父->子,抽象->父->具体父)。这样你就不会破坏通用继承。要么将其移出继承(abstract->parent->sub 到 abstract->parent,abstract->sub)。
    • 我一直在尝试这样做,我假设没有任何表/实体注释,因为它们在我的应用程序中给我带来了冗余错误。它是否正确?具体的父级应该有它们还是继承类型注释?使用这种方法我遇到了其他问题,但我不确定它们是否相关(例如获取时的 NPE 等)。
    • Err...实际上我在这个抽象实体的 dao 测试中得到了 NPE,所以我很确定它是相关的。
    • DAO 的泛型应该是父类型。父实体应该有表/实体注释。根据您的继承策略,它还应该具有 Inheritance 和可能的 DescriminatorColumn。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 2013-06-12
    • 2017-01-29
    • 2011-06-20
    相关资源
    最近更新 更多