在插件中使用Hibernate实体和Dao

Skip to end of metadata



Go to start of metadata


有时候,您可能希望拥有自己的Hibernate实体和dao来访问插件中的额外数据库表。通过添加以下文件和类到您的插件是非常简单的。

与Spring + Hibernate的开发类似,插件需要一个应用程序上下文文件。在我的示例插件中,我创建了一个如下所示的productsApplicationContext.xm

 

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xmlns:p="http://www.springframework.org/schema/p"

       xmlns:aop="http://www.springframework.org/schema/aop"

       xmlns:tx="http://www.springframework.org/schema/tx"

       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd

       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd

       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

 

 

 

    <bean id="productSessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">

        <property name="dataSource" ref="setupDataSource"/>

        <property name="mappingResources">

            <list>

                <value>/org/joget/sample/products/model/Products.hbm.xml</value>

             </list>

        </property>

        <property name="hibernateProperties">

            <props>

                <prop key="hibernate.hbm2ddl.auto">update</prop>

                <prop key="hibernate.show_sql">false</prop>

                <prop key="hibernate.format_sql">false</prop>

            </props>

        </property>

    </bean>

 

    <bean id="productsDao" class="org.joget.products.dao.ProductsDaoImpl">

        <property name="sessionFactory" ref="productSessionFactory" />

    </bean>

 

</beans>

 

在应用程序的上下文中,我创建了2个bean。Bean“productSessionFactory”是用hibernate映射文件初始化会话工厂。Bean“productsDao”是初始化我的示例插件的dao对象。

接下来,我们需要一个Hibernate映射文件。在我的示例插件中,它是/org/joget/sample/products/model/Products.hbm.xml。它将POJO“org.joget.products.model.Product”映射到“valu_products”表。

 

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

  <class entity-name="Products" name="org.joget.products.model.Product" table="valu_products">

    <id column="id" name="id" type="string"/>

    <property column="name" name="name" type="string"/>

    <property column="description" name="description" type="string"/>

  </class>

</hibernate-mapping>

 

您需要一个实用程序类来初始化您的应用程序上下文,并允许您检索该bean对象。

 

package org.joget.products;

 

import org.joget.apps.app.service.AppUtil;

import org.springframework.context.support.AbstractApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

 

public class AppContext {

 

    private static AppContext instance;

    private AbstractApplicationContext appContext;

 

    public synchronized static AppContext getInstance() {

        if (instance == null) {

            instance = new AppContext();

        }

        return instance;

    }

 

    private AppContext() {

        Thread currentThread = Thread.currentThread();

        ClassLoader threadContextClassLoader = currentThread.getContextClassLoader();

        try {

            currentThread.setContextClassLoader(this.getClass().getClassLoader());

            this.appContext = new ClassPathXmlApplicationContext(new String[]{"/productsApplicationContext.xml"}, this.getClass(), AppUtil.getApplicationContext());

        } finally {

            currentThread.setContextClassLoader(threadContextClassLoader);

        }

    }

 

    public AbstractApplicationContext getAppContext() {

        return appContext;

    }

}

 

与joget版本4相比,您需要使用orverride  findSession 方法  ProductsDaoImpl

 

 

package org.joget.products.dao;

import java.util.Collection;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.joget.commons.spring.model.AbstractSpringDao;

import org.joget.commons.util.LogUtil;

import org.joget.products.model.Product;

 

public class ProductsDaoImpl extends AbstractSpringDao implements ProductsDao {

 

    @Override

    public Session findSession() {

        Session session = null;

        SessionFactory sf = super.getSessionFactory();

         

        try {

            session = sf.getCurrentSession();

        } catch (Exception e) {}

         

        if (session == null) {

            session = sf.openSession();

        }

         

        return session;

    }

     

    public Boolean addProduct(Product product) {

        try {

            save("Products", product);

            return true;

        } catch (Exception e) {

            LogUtil.error(ProductsDaoImpl.class.getName(), e, "Add Product Error!");

            return false;

        }

    }

 

    public Boolean updateProduct(Product product) {

        try {

            merge("Products", product);

            return true;

        } catch (Exception e) {

            LogUtil.error(ProductsDaoImpl.class.getName(), e, "Update Product Error!");

            return false;

        }

    }

 

    public Boolean deleteProduct(String id) {

        try {

            Product product = getProduct(id);

            if (product != null) {

           

                delete("Products", product);

            }

            return true;

        } catch (Exception e) {

            LogUtil.error(ProductsDaoImpl.class.getName(), e, "Delete Product Error!");

            return false;

        }

    }

 

    public Product getProduct(String id) {

        try {

            return (Product) find("Products", id);

        } catch (Exception e) {

            LogUtil.error(ProductsDaoImpl.class.getName(), e, "Get Product Error!");

            return null;

        }

    }

 

    public Collection<Product> getProducts() {

        try {

            Collection products = super.find("Products", "", null, null, null, null, null);

            return products;

        } catch (Exception e) {

            LogUtil.error(ProductsDaoImpl.class.getName(), e, "Get Products Error!");

        }

        return null;

    }

   

}

 

在你实现你的POJO和dao类后,你应该可以在你的插件中使用你的dao,如下所示。请参阅POJO附带的示例插件和dao实现。

 

ProductsDao productdao = (ProductsDao) AppContext.getInstance().getAppContext().getBean("productsDao");

 

Product p = new Product();

p.setId("001");

p.setName("Product A");

p.setDescription("Product A Descpription");

 

productdao.addProduct(p);

 

In this KB:sample plugin, 您可以通过以下JSON API添加,删除和列出产品。

ADD,

 

http://localhost:8080/jw/web/json/plugin/org.joget.products.ProductsApi/service?_action=add&name=Product A&desc=Product A Descpription

 

DELETE,

 

http://localhost:8080/jw/web/json/plugin/org.joget.products.ProductsApi/service?_action=delete&id=001

 

LIST,

 

http://localhost:8080/jw/web/json/plugin/org.joget.products.ProductsApi/service?_action=list

文档更新时间: 2018-11-06 06:44   作者:李庆