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

来源:互联网 发布:阿里企业邮箱端口 编辑:程序博客网 时间:2024/06/06 02:51
原文标题: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 字段。
0 0
原创粉丝点击