代码之家  ›  专栏  ›  技术社区  ›  matt b

对于Hibernate,我可以将每个子类的表和同一个表中的<map>混合在一起吗?

  •  0
  • matt b  · 技术社区  · 15 年前

    我正试图为“促销”映射一个对象模型;也就是说,客户在注册时输入促销代码。

    不同的促销代码可能有不同类型的“好处”,这意味着我们给客户的是什么。 例如:促销代码XYZ123将为客户在其帐户中提供免费的分钟数,而另一个促销代码将为用户在注册时可以选择的各种订阅计划提供各种折扣。

    在我的领域模型中,我用一个具有公共属性的抽象超类将不同类型的利益建模为子类。我选择将不同类型建模为子类,因为某些类型的利益需要不同的属性。

    public abstract class Benefit {
        //getters/setters for common attributes
    }
    
    public class FreeMinutesBenefit extends Benefit {
        public int getFreeMinutes() {...}
        public void setFreeMinutes(int minutes} {...}
    }
    
    public class PriceDiscountBenefit extends Benefit {
        public Map<Plan, BigDecimal> getDiscountMap() {...}
        public void setDiscountMap(Map<Plan, BigDecimal> map) {...}
    }
    

    粗略的SQL架构:

    -- Parent table, maps promotion to benefits
    create table Promo_Benefit (
        map_id integer auto-generated PRIMARY KEY,
        promo_id integer references PROMOTION(promo_id),
        type_id integer references BENEFIT_TYPES(type_id)
    );
    
    create table BenefitDetails_FreeMinutes (
        map_id integer PRIMARY KEY,
        minutes integer not null,
        FOREIGN KEY (map_id) references Promo_Benefit(map_id)
    );
    
    create table BenefitDetails_PriceDiscount (
        map_id integer references Promo_Benefit(map_id),
        plan_id integer references Plans(plan_id),
        reduced_price numeric not null,
        PRIMARY KEY (map_id, plan_id)
        FOREIGN KEY (map_id) references Promo_Benefit(map_id)
    );
    

    我可以成功地映射Hibernate映射文件中每个子类的基本属性,但是我很难找到如何映射关联 在PriceDiscountBenefit子类和Plan类之间。

    我想这是因为子类表的主键(BenefitDetails_PriceDiscount)不仅仅是 map_id 列-换句话说,此子类表中的多个行将构成单个PriceDiscountBenefit实体。从我所看到的,似乎Hibernate中每个子类支持的表都是针对子类表中的一行映射到父表中的一行的实例,并且映射 <map> 应引用包含键/值的第二个表。

    我是不是完全错了?我不知道我是否有问题,因为我要根据子类模式来划分表。

    1 回复  |  直到 15 年前
        1
  •  1
  •   ChssPly76    15 年前

    每个子类的表策略意味着您的层次结构中的每个类都有一个表(包括抽象类,如果有的话),并且它们都有共享的主键。在您的情况下,这意味着您将为每个 Benefit , FreeMinutesBenefit PriceDiscountBenefit 类。您的表名有点混乱,表结构与每个子类的表有些不一致。

    假设 map_id 是共享的主键, BenefitDetails_PriceDiscount 表必须这样定义它。 plan_id 属于不同的('映射 ) table that will hold a map between 价格折扣优惠 , plan`和十进制值。换言之:

    create table BenefitDetails_PriceDiscount (
            map_id integer PRIMARY KEY,
            ... /* any other attributes, perhaps? */
            FOREIGN KEY (map_id) references Promo_Benefit(map_id)
    );
    
    create table BenefitDetails_PriceDiscount_Map (
            map_id integer references Promo_Benefit(map_id),
            plan_id integer references Plans(plan_id),
            reduced_price numeric not null,
            PRIMARY KEY (map_id, plan_id)
            FOREIGN KEY (map_id) references Promo_Benefit(map_id)
    );