神刀安全网

电商系统Broadleaf文档翻译(七) – 扩展实体extending entities

原文标题:main services

原文出处: http://www.broadleafcommerce.com/docs/core/current/broadleaf-concepts/data-and-service-models/extending-entities

译者:IT十年

译文链接: http://www.ittenyear.com/394/broadleaf-extending-entities /

本译文仅用于学习和交流目的,转载请保留原文链接和译文链接!

有时候,BLC提供的实体不能满足你的需要。比如,对于特殊的业务逻辑,你可能需要以特殊的方式表示一个订单ID,这个ID和BLC的内部订单ID不兼容。在这种情况下,应该在订单类中添加一个新的字段,这个字段可以保存你生成的满足你的需要的订单ID。要实现这个目标,就要扩展实体。

让我们从实现一个自定义的实体范例MyOrderImpl开始。

@Entity

@Table(name = "MY_ORDER")

public class MyOrderImpl extends OrderImpl {

    private static final long serialVersionUID = 1L;

    @Column(name = "MY_ORDER_ID")

    private String myOrderId;

    … getters / setters / equals / hashcode …

}

我们创建了一个新的自定义实体,他继承了BLC的OrderImpl 实体。我们给实体添加了自定义的订单ID字段myOrderId,通过JPA的注解,我们把这个实体和字段与数据库中的表和列绑定在一起。

注:BLC中所有的实体扩展都使用标准的JPA策略。

如果你知道怎么使用JPA,那你就知道怎么使用并扩展BLC实体。当然,你需要一张非安全模式(参阅数据库模型)下的数据库表MY_ORDER来支持你的实体。表里有一个能保存long型数据的字段ORDER_ID(这个字段是你的新表和BLC订单表的关联字段),还有一个VarChar 类型的字段MY_ORDER_ID,它保存你的自定义订单ID。

因为我们创建了扩展的实体,所以要把实体和它的实例化方式告知BLC:在应用程序上下文中添加一个bean配置:

<bean id="org.broadleafcommerce.core.order.domain.Order" class="com.mycompany.order.domain.MyOrderImpl" scope="prototype"/>

最后,把新的实体类添加到persistence.xml文件的持久化单元配置中,像这样:

<persistence-unit name="blPU" transaction-type="RESOURCE_LOCAL">

    …

    <class>com.mycompany.order.domain.MyOrderImpl</class>

    …

</persistence-unit>

关于在BLC程序中配置持久化的更多信息,请参阅持久化配置部分。

这是在BLC中使用自定义实体的最简单的配置。配置完成后,每当需要一个新的订单实例时,BLC就会创建一个MyOrderImpl 的实例。

这种实现方法过于简单,他的唯一问题是,虽然实体可以实例化,但是myOrderId 字段却不会赋值。对很多自定义的字段类型来说,可能这样满足要求,但在这个例子里,我们希望myOrderId 字段可以立即赋值。那么我们看一下有什么办法可以解决这个问题。

a、重写OrderDaoImpl 的create()方法,添加一段设置自定义订单ID的代码(这种方法和扩展服务很类似,可以参阅服务扩展指南)。

b、在MyOrderImpl的spring配置中,为myOrderId 字段添加一个工厂bean。

如果可以的话,推荐使用工厂bean方式,因为可以和BLC保持松耦合。怎么做呢,从工厂bean开始:

public class MyOrderIdFactoryBean implements FactoryBean {

    public Object getObject() throws Exception {

        String myOrderId = null;

        //TODO add some code to create the custom order id

        return myOrderId;

    }

    public Class getObjectType() {

        return String.class;

    }

    public boolean isSingleton() {

        return false;

    }

}

这个简单地工厂bean只是给spring提供一个对象实例以及该对象的类型:一个String类型的自定义订单id。

然后,为新的ID生成工厂添加配置。

<bean id="org.broadleafcommerce.core.order.domain.Order" class="com.mycompany.order.domain.MyOrderImpl" scope="prototype">

    <property name="myOrderId">

        <bean class="com.mycompany.order.service.MyOrderIdFactoryBean"/>

    </property>

</bean>

上面的代码中,我们用一个稍微复杂的bean定义替换了原来的bean,加入了工厂bean。当BLC向Spring请求一个订单Order实例时,就可以得到一个MyOrderImpl 实例,它有一个通过MyOrderIdFactoryBean赋值的myOrderId 字段。

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » 电商系统Broadleaf文档翻译(七) – 扩展实体extending entities

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
分享按钮