Joget DX 8 Stable Released
The stable release for Joget DX 8 is now available, with a focus on UX and Governance.
有时候,您可能希望拥有自己的Hibernate实体和dao来访问插件中的额外数据库表。通过添加以下文件和类到您的插件是非常简单的。
与Spring + Hibernate的开发类似,插件需要一个应用程序上下文文件。在我的示例插件中,我创建了一个如下所示的productsApplicationContext.xm
<?xml version= "1.0" encoding= "UTF-8" ?> <beans xmlns= "http://www.springframework.org/schema/beans" 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 |