Просмотр исходного кода

Merge branch 'feature/自定义表查询允许跨表关联查询' into 'develop'

[数据中心]/自建表查询允许跨表关联查询

See merge request o2oa/o2oa!1773
o2null 5 лет назад
Родитель
Сommit
2e7e7e317f

+ 31 - 2
o2server/x_base_core_project/src/main/java/com/x/base/core/container/factory/PersistenceXmlHelper.java

@@ -7,11 +7,12 @@ import java.util.List;
 import java.util.Properties;
 
 import com.x.base.core.container.FactorDistributionPolicy;
+import com.x.base.core.entity.dynamic.DynamicBaseEntity;
 import com.x.base.core.entity.JpaObject;
+import com.x.base.core.entity.dynamic.DynamicEntity;
 import com.x.base.core.entity.tools.JpaObjectTools;
 import com.x.base.core.project.config.Config;
 import com.x.base.core.project.config.Node;
-import com.x.base.core.project.tools.Crypto;
 import com.x.base.core.project.tools.ListTools;
 
 import org.apache.commons.io.FileUtils;
@@ -146,7 +147,7 @@ public class PersistenceXmlHelper {
 		property.addAttribute("value", "false");
 	}
 
-	public static List<String> write(String path, List<String> entities) throws Exception {
+	public static List<String> write(String path, List<String> entities, boolean dynamicFlag) throws Exception {
 		List<String> names = new ArrayList<>();
 		String name = "";
 		try {
@@ -157,6 +158,7 @@ public class PersistenceXmlHelper {
 			persistence.addAttribute(QName.get("schemaLocation", "xsi", "http://www.w3.org/2001/XMLSchema-instance"),
 					"http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd");
 			persistence.addAttribute("version", "2.0");
+			List<String> dyClasses = new ArrayList<>();
 			for (String className : names) {
 				name = className;
 				Class<? extends JpaObject> clazz = (Class<JpaObject>) Class.forName(className);
@@ -170,6 +172,33 @@ public class PersistenceXmlHelper {
 					mapped_element.addText(o.getName());
 				}
 			}
+			if(dynamicFlag) {
+				for (String className : names) {
+					if (className.startsWith(DynamicEntity.CLASS_PACKAGE)) {
+						dyClasses.add(className);
+					}
+				}
+				if (!dyClasses.isEmpty()) {
+					String dyClassName = DynamicBaseEntity.class.getName();
+					names.add(dyClassName);
+
+					Element unit = persistence.addElement("persistence-unit");
+					unit.addAttribute("name", dyClassName);
+					unit.addAttribute("transaction-type", "RESOURCE_LOCAL");
+					Element provider = unit.addElement("provider");
+					provider.addText(PersistenceProviderImpl.class.getName());
+					for (String dyClass : dyClasses) {
+						Element mapped_element = unit.addElement("class");
+						mapped_element.addText(dyClass);
+					}
+					for (Class<?> o : JpaObjectTools.scanMappedSuperclass(DynamicBaseEntity.class)) {
+						if(!o.getName().equals(DynamicBaseEntity.class.getName())) {
+							Element mapped_element = unit.addElement("class");
+							mapped_element.addText(o.getName());
+						}
+					}
+				}
+			}
 			OutputFormat format = OutputFormat.createPrettyPrint();
 			format.setEncoding("UTF-8");
 			File file = new File(path);

+ 1 - 1
o2server/x_base_core_project/src/main/java/com/x/base/core/container/factory/SliceEntityManagerContainerFactory.java

@@ -49,7 +49,7 @@ public abstract class SliceEntityManagerContainerFactory {
 	protected SliceEntityManagerContainerFactory(String webApplicationDirectory, List<String> entities,
 			boolean sliceFeatureEnable) throws Exception {
 		File path = new File(webApplicationDirectory + "/WEB-INF/classes/" + PERSISTENCE_XML_PATH);
-		List<String> classNames = PersistenceXmlHelper.write(path.getAbsolutePath(), entities);
+		List<String> classNames = PersistenceXmlHelper.write(path.getAbsolutePath(), entities, true);
 		for (String className : classNames) {
 			Class<? extends JpaObject> clz = (Class<? extends JpaObject>) Class.forName(className);
 			checkPersistFieldMap.put(clz, this.loadCheckPersistField(clz));

+ 25 - 0
o2server/x_base_core_project/src/main/java/com/x/base/core/entity/dynamic/DynamicBaseEntity.java

@@ -0,0 +1,25 @@
+package com.x.base.core.entity.dynamic;
+
+
+import com.x.base.core.entity.SliceJpaObject;
+
+public class DynamicBaseEntity extends SliceJpaObject {
+
+	private static final long serialVersionUID = -4334572608549855123L;
+
+	public String getId() {
+		return id;
+	}
+
+	public void setId(String id) {
+		this.id = id;
+	}
+
+	private String id = createId();
+
+	/* 以上为 JpaObject 默认字段 */
+
+	public void onPersist() throws Exception {
+	}
+
+}

+ 1 - 1
o2server/x_console/src/main/java/com/x/server/console/action/DumpData.java

@@ -88,7 +88,7 @@ public class DumpData {
 				logger.print("find {} data to dump, start at {}.", classNames.size(), DateTools.format(start));
 				Path xml = Paths.get(Config.dir_local_temp_classes().getAbsolutePath(),
 						DateTools.compact(start) + "_dump.xml");
-				PersistenceXmlHelper.write(xml.toString(), classNames);
+				PersistenceXmlHelper.write(xml.toString(), classNames, false);
 				StorageMappings storageMappings = Config.storageMappings();
 				Stream<String> stream = BooleanUtils.isTrue(Config.dumpRestoreData().getParallel())
 						? classNames.parallelStream()

+ 1 - 1
o2server/x_console/src/main/java/com/x/server/console/action/EraseContent.java

@@ -69,7 +69,7 @@ public abstract class EraseContent {
 				StorageMappings storageMappings = Config.storageMappings();
 				File persistence = new File(Config.dir_local_temp_classes(),
 						DateTools.compact(this.start) + "_eraseContent.xml");
-				PersistenceXmlHelper.write(persistence.getAbsolutePath(), classNames);
+				PersistenceXmlHelper.write(persistence.getAbsolutePath(), classNames, false);
 				for (int i = 0; i < classNames.size(); i++) {
 					Class<? extends JpaObject> cls = (Class<? extends JpaObject>) Thread.currentThread()
 							.getContextClassLoader().loadClass(classNames.get(i));

+ 1 - 1
o2server/x_console/src/main/java/com/x/server/console/action/RestoreData.java

@@ -101,7 +101,7 @@ public class RestoreData {
 				logger.print("find: {} data to restore, path: {}.", classNames.size(), this.dir.toString());
 				Path xml = Paths.get(Config.dir_local_temp_classes().getAbsolutePath(),
 						DateTools.compact(start) + "_restore.xml");
-				PersistenceXmlHelper.write(xml.toString(), classNames);
+				PersistenceXmlHelper.write(xml.toString(), classNames, false);
 				Stream<String> stream = BooleanUtils.isTrue(Config.dumpRestoreData().getParallel())
 						? classNames.parallelStream()
 						: classNames.stream();

+ 8 - 1
o2server/x_query_assemble_designer/src/main/java/com/x/query/assemble/designer/jaxrs/statement/ActionExecute.java

@@ -9,6 +9,7 @@ import javax.script.Bindings;
 import javax.script.ScriptContext;
 import javax.script.SimpleScriptContext;
 
+import com.x.base.core.entity.dynamic.DynamicBaseEntity;
 import org.apache.commons.lang3.StringUtils;
 
 import com.google.gson.JsonElement;
@@ -95,7 +96,13 @@ class ActionExecute extends BaseAction {
 			throws Exception {
 		Object data = null;
 		Class<? extends JpaObject> cls = this.clazz(business, statement);
-		EntityManager em = business.entityManagerContainer().get(cls);
+		EntityManager em;
+		if(StringUtils.equalsIgnoreCase(statement.getEntityCategory(), Statement.ENTITYCATEGORY_DYNAMIC)
+				&& StringUtils.equalsIgnoreCase(statement.getType(), Statement.TYPE_SELECT)){
+			em = business.entityManagerContainer().get(DynamicBaseEntity.class);
+		}else{
+			em = business.entityManagerContainer().get(cls);
+		}
 		Query query = em.createQuery(statement.getData());
 		for (Parameter<?> p : query.getParameters()) {
 			if (runtime.hasParameter(p.getName())) {

+ 6 - 2
o2server/x_query_assemble_designer/src/main/java/com/x/query/assemble/designer/jaxrs/table/ActionExecute.java

@@ -3,6 +3,7 @@ package com.x.query.assemble.designer.jaxrs.table;
 import javax.persistence.EntityManager;
 import javax.persistence.Query;
 
+import com.x.base.core.entity.dynamic.DynamicBaseEntity;
 import org.apache.commons.lang3.StringUtils;
 
 import com.google.gson.JsonElement;
@@ -36,10 +37,11 @@ class ActionExecute extends BaseAction {
 			DynamicEntity dynamicEntity = new DynamicEntity(table.getName());
 			@SuppressWarnings("unchecked")
 			Class<? extends JpaObject> cls = (Class<JpaObject>) Class.forName(dynamicEntity.className());
-			EntityManager em = emc.get(cls);
-			Query query = em.createQuery(wi.getData());
+
 			Object data = null;
 			if (StringUtils.equalsIgnoreCase(wi.getType(), Statement.TYPE_SELECT)) {
+				EntityManager em = emc.get(DynamicBaseEntity.class);
+				Query query = em.createQuery(wi.getData());
 				if ((null != wi.getMaxResults()) && (wi.getMaxResults() > 0)) {
 					query.setMaxResults(wi.getMaxResults());
 				}
@@ -48,6 +50,8 @@ class ActionExecute extends BaseAction {
 				}
 				data = query.getResultList();
 			} else {
+				EntityManager em = emc.get(cls);
+				Query query = em.createQuery(wi.getData());
 				emc.beginTransaction(cls);
 				data = query.executeUpdate();
 				emc.commit();

+ 9 - 1
o2server/x_query_assemble_surface/src/main/java/com/x/query/assemble/surface/jaxrs/statement/ActionExecute.java

@@ -10,6 +10,7 @@ import javax.script.CompiledScript;
 import javax.script.ScriptContext;
 import javax.script.SimpleScriptContext;
 
+import com.x.base.core.entity.dynamic.DynamicBaseEntity;
 import org.apache.commons.lang3.StringUtils;
 
 import com.google.gson.JsonElement;
@@ -132,7 +133,14 @@ class ActionExecute extends BaseAction {
 			throws Exception {
 		Object data = null;
 		Class<? extends JpaObject> cls = this.clazz(business, statement);
-		EntityManager em = business.entityManagerContainer().get(cls);
+		EntityManager em;
+		if(StringUtils.equalsIgnoreCase(statement.getEntityCategory(), Statement.ENTITYCATEGORY_DYNAMIC)
+				&& StringUtils.equalsIgnoreCase(statement.getType(), Statement.TYPE_SELECT)){
+			em = business.entityManagerContainer().get(DynamicBaseEntity.class);
+		}else{
+			em = business.entityManagerContainer().get(cls);
+		}
+
 		Query query = em.createQuery(statement.getData());
 		for (Parameter<?> p : query.getParameters()) {
 			if (runtime.hasParameter(p.getName())) {