热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringBoot+SpringDataJPA项目整合开发记录(持续更新)

2019独角兽企业重金招聘Python工程师标准刚换了公司,项目架构师提出新的系统架构时还是愣了一下,搭建难度较低,很容易上手&#x

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

刚换了公司,项目架构师提出新的系统架构时还是愣了一下,搭建难度较低,很容易上手,但是对Spring Data JPA的了解不够深入,所以还是有些吃力,在框架搭建初期有许多东西并没有很好的集成。

20180714-这个项目表与表之间的耦合度太低了,且不允许在实体类中进行外键对象关联,一对多、多对一、多对多的关系处理就比较复杂了,Spring Data JPA提供了好几种不同的接口调用方式,因此什么时候使用什么样的方法显得尤为重要,不同的方法编写方式也不太一样,在数据处理方面比较头疼,如果需要抽取不同表之间的数据为结果,要做联合查询且需要额外在声明一个相应的实体类来接受,不然就只能将外键表字段存储到本表中,相当费劲。

 框架体系

Spring Boot + Spring Data JPA + Spring Security + Spring Security oAuth2.0 + Thymeleaf

Spring Boot

Spring Data JPA

Spring Security

Thymeleaf

Vue.js

Vue Element-ui

Node.js 与 NPM(辅助,安装Node后,NPM会附带安装),附带webpack工具、路由等。

实体类中并没有声明任何外键关联关系,因此我们查询了许多种方法来解决外键关联查询并返回结果的方法。

Spring Data JPA - JpaRepository

Spring Data JPA - PagingAndSortingRepository

Spring Data JPA - JpaSpecificationExecutor

Spring Data JPA - Query

Spring Data JPA - QueryDSL

Spring Data JPA - CriteriaBuilder

NPM安装与配置:

配置npm的全局模块的存放路径以及cache的路径,在node根目录下建立node_cache和node_global文件夹。

58afcb0d889b0b7634168d52ff0e5045292.jpg

启动CMD,输入以下命令:

npm config set prefix "D:\DevelopTool\nodejs\node_global"
以及
npm config set cache "D:\DevelopTool\nodejs\node_cache"

安装(Express)测试模块,输入以下命令,-g代表将该插件安装到全局目录中,node_golbal。

npm install express -g

设置环境变量,用户变量下新建"NODE_PATH",输入”D:\DevelopTool\Nodejs\node_global“。

用户变量,修改"PATH",添加“%NODE_PATH%;”。

在D:\DevelopTool\nodejs\node_modules\npm目录下,使用命令行进行安装。

# install dependency
npm install# develop
npm run dev

 

Spring Boot 与 Spring MVC的区别?

Spring 框架就像一个家族,有众多衍生产品例如 MVC、boot、security、jpa等等。但他们的基础都是Spring 的 ioc和 aop ioc 提供了依赖注入的容器 aop ,解决了面向横切面的编程,然后在此两者的基础上实现了其他延伸产品的高级功能。

Spring MVC是一个前端框架。Spring MVC是基于 Servlet 的一个 MVC 框架 主要解决 WEB 开发的问题,因为 Spring 的配置非常复杂,各种XML、 JavaConfig、hin处理起来比较繁琐。

Spring Boot换而言之,是一个Spring框架的一种形式。

Spring Boot实现了自动配置,降低了项目搭建的复杂度。

众所周知Spring框架需要进行大量的配置,Spring Boot引入自动配置的概念,让项目设置变得很容易。Spring Boot本身并不提供Spring框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于Spring框架的应用程序。也就是说,它并不是用来替代Spring的解决方案,而是和Spring框架紧密结合用于提升Spring开发者体验的工具。同时它集成了大量常用的第三方库配置(例如Jackson, JDBC, Mongo, Redis, Mail等等),Spring Boot应用中这些第三方库几乎可以零配置的开箱即用(out-of-the-box),大部分的Spring Boot应用都只需要非常少量的配置代码,开发者能够更加专注于业务逻辑。、

DAO层代码示例-20180720重新更新代码(使用countBy、getBy、findBy等内部规定表达式可以完成简单的操作,后续And等,带实体类对应的属性名称即可)

package com.hz.partyorg.dao;import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.PagingAndSortingRepository;import com.hz.partyorg.entity.PartyOrgDeclareBasic;import java.util.List;/*** 党组织-申报信息与基本信息联合记录* @author Wen.C*/
public interface PartyOrgDeclareBasicDAO extends JpaRepository,
PagingAndSortingRepository,
JpaSpecificationExecutor {Long countByDzzSbxxId(String dzzSbxxId);PartyOrgDeclareBasic getByDzzJbxxIdAndDzzSbxxId(String dzzJbxxId, String dzzSbxxId);PartyOrgDeclareBasic getByDzzSbxxIdAndAuditStatus(String dzzSbxxId, String auditStatus);List findByDzzSbxxIdAndAuditStatus(String dzzSbxxId, String auditStatus);
}

Service层示例-20180720重新更新代码:

package com.hz.partyorg.service;import java.util.ArrayList;
import java.util.List;import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;import com.hz.common.config.GlobalConfig;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;import com.hz.partyorg.dao.PartyOrgDeclareBasicDAO;
import com.hz.partyorg.entity.PartyOrgDeclareBasic;/*** 党组织-申报信息与基本信息联合记录* @author Wen.C*/
@Service
public class PartyOrgDeclareBasicService {&#64;Autowiredprivate PartyOrgDeclareBasicDAO partyOrgDeclareBasicDAO;/*** 党组织-申报信息与基本信息联合记录-保存数据* &#64;param partyOrgDeclareBasic*/public PartyOrgDeclareBasic save(PartyOrgDeclareBasic partyOrgDeclareBasic) {return partyOrgDeclareBasicDAO.save(partyOrgDeclareBasic);}/*** 党组织-申报信息-列表查询&#xff0c;根据传入Type判断&#xff0c;标记为是否为 0-需要审批的数据 1-历史数据* &#64;param type 0-需要审批的数据 1-历史数据 null-取消条件* &#64;param partyOrgDeclareBasic 实体对象* &#64;return*/public List list(Integer type, PartyOrgDeclareBasic partyOrgDeclareBasic){Specification spec &#61; new Specification() {&#64;Overridepublic Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder cb) {List list &#61; new ArrayList<>();if(null !&#61; type && 0 &#61;&#61; type){ // 0-需要审批的数据list.add(cb.notEqual(root.get("auditStatus"), GlobalConfig.AUDIT_STATUS_TRANSFER_YES));list.add(cb.notEqual(root.get("auditStatus"), GlobalConfig.AUDIT_STATUS_YES));} else if(null !&#61; type && 1 &#61;&#61; type){ // 1-历史数据list.add(cb.notEqual(root.get("auditStatus"), GlobalConfig.AUDIT_STATUS_WAITE));list.add(cb.notEqual(root.get("auditStatus"), GlobalConfig.AUDIT_STATUS_TRANSFER));}if(StringUtils.isNotEmpty(partyOrgDeclareBasic.getDzzJbxxId()) && StringUtils.isNotBlank(partyOrgDeclareBasic.getDzzJbxxId())){list.add(cb.equal(root.get("dzzJbxxId"), partyOrgDeclareBasic.getDzzJbxxId()));}if(StringUtils.isNotEmpty(partyOrgDeclareBasic.getDzzSbxxId()) && StringUtils.isNotBlank(partyOrgDeclareBasic.getDzzSbxxId())){list.add(cb.equal(root.get("dzzSbxxId"), partyOrgDeclareBasic.getDzzSbxxId()));}Predicate[] p &#61; new Predicate[list.size()];return cb.and(list.toArray(p));}};return partyOrgDeclareBasicDAO.findAll(spec ,new Sort(Sort.Direction.DESC, "id"));}/*** 党组织-申报信息-分页查询* &#64;param partyOrgDeclareBasic 实体对象* &#64;param pageNo 当前页码* &#64;param pageSize 显示条数* &#64;return*/public Page page(PartyOrgDeclareBasic partyOrgDeclareBasic, Integer pageNo, Integer pageSize){Specification spec &#61; new Specification() {&#64;Overridepublic Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder cb) {List list &#61; new ArrayList<>();if(StringUtils.isNotEmpty(partyOrgDeclareBasic.getDzzSbxxId()) && StringUtils.isNotBlank(partyOrgDeclareBasic.getDzzSbxxId())){list.add(cb.equal(root.get("dzzSbxxId"), partyOrgDeclareBasic.getDzzSbxxId()));}if(StringUtils.isNotEmpty(partyOrgDeclareBasic.getDzzJbxxId()) && StringUtils.isNotBlank(partyOrgDeclareBasic.getDzzJbxxId())){list.add(cb.equal(root.get("dzzJbxxId"), partyOrgDeclareBasic.getDzzJbxxId()));}if(StringUtils.isNotEmpty(partyOrgDeclareBasic.getAuditResultsTime()) && StringUtils.isNotBlank(partyOrgDeclareBasic.getAuditResultsTime())){list.add(cb.equal(root.get("auditResultsTime"), partyOrgDeclareBasic.getAuditResultsTime()));}Predicate[] p &#61; new Predicate[list.size()];return cb.and(list.toArray(p));}};return partyOrgDeclareBasicDAO.findAll(spec ,new PageRequest(pageNo, pageSize, new Sort(Sort.Direction.DESC, "id")));}/*** 党组织-申报信息-分页查询&#xff08;判断条件&#xff1a;auditResultsTime 审批时间 不为空&#xff09;* &#64;param partyOrgDeclareBasic 实体对象* &#64;param pageNo 当前页码* &#64;param pageSize 显示条数* &#64;return*/public Page pageByAuditResultTimeIsNotNull(PartyOrgDeclareBasic partyOrgDeclareBasic, Integer pageNo, Integer pageSize){Specification spec &#61; new Specification() {&#64;Overridepublic Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder cb) {List list &#61; new ArrayList<>();if(null !&#61; partyOrgDeclareBasic.getDzzJbxxId() && StringUtils.isNotBlank(partyOrgDeclareBasic.getDzzJbxxId())){list.add(cb.equal(root.get("dzzJbxxId"), partyOrgDeclareBasic.getDzzJbxxId()));}list.add(root.get("auditResultsTime").isNotNull());Predicate[] p &#61; new Predicate[list.size()];return cb.and(list.toArray(p));}};return partyOrgDeclareBasicDAO.findAll(spec ,new PageRequest(pageNo, pageSize, new Sort(Sort.Direction.DESC, "id")));}/*** 根据党组织ID查询记录总数* &#64;param dzzSbxxId* &#64;return*/public Long countByDzzSbxxId(String dzzSbxxId) {return partyOrgDeclareBasicDAO.countByDzzSbxxId(dzzSbxxId);}/*** 根据党组织Id和申报信息Id查询指定数据* &#64;param dzzJbxxId* &#64;param dzzSbxxId* &#64;return*/public PartyOrgDeclareBasic getByDzzJbxxIdAndDzzSbxxId(String dzzJbxxId, String dzzSbxxId) {return partyOrgDeclareBasicDAO.getByDzzJbxxIdAndDzzSbxxId(dzzJbxxId, dzzSbxxId);}/*** 根据申报信息Id和审批状态查询指定数据* &#64;param dzzSbxxId* &#64;param auditStatus* &#64;return*/public PartyOrgDeclareBasic getByDzzSbxxIdAndAuditStatus(String dzzSbxxId, String auditStatus) {return partyOrgDeclareBasicDAO.getByDzzSbxxIdAndAuditStatus(dzzSbxxId, auditStatus);}/*** 根据申报信息Id和审批状态查询数据返回集合* &#64;param dzzSbxxId* &#64;param auditStatus* &#64;return*/public List findByDzzSbxxIdAndAuditStatus(String dzzSbxxId, String auditStatus) {return partyOrgDeclareBasicDAO.findByDzzSbxxIdAndAuditStatus(dzzSbxxId, auditStatus);}
}

Manager特殊业务处理层与Dao同级存在&#xff0c;不同业务场景调用&#xff08;用于关联表查询以及返回联合数据结果&#xff09;-20180720&#xff0c;使用到QueryDSL。

package com.hz.partyorg.dao;import com.hz.partyorg.entity.*;
import com.hz.partyorg.vo.PartyOrgDeclareInformationVo;
import com.querydsl.core.Tuple;
import com.querydsl.jpa.impl.JPAQuery;
import com.querydsl.jpa.impl.JPAQueryFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** 申报信息、申报与党组织信息联合处理类&#xff0c;联合查询&#xff0c;返回Vo实体类对象&#xff0c;自由封装*/
&#64;Component
public class PartyOrgDeclareBasicManager {&#64;Autowired&#64;PersistenceContextprivate EntityManager entityManager;private JPAQueryFactory queryFactory;&#64;PostConstructpublic void init() {queryFactory &#61; new JPAQueryFactory(entityManager);}/*** 针对申报信息做的联合查询方法* &#64;param dzzJbxxId 党组织ID* &#64;param dzzSbxxIds 申报信息ID 集合* &#64;param pageNo 当前页数* &#64;param pageSize 每页显示条数* &#64;return*/public Map findList(String dzzJbxxId, List dzzSbxxIds, Integer pageNo, Integer pageSize){Map result &#61; new HashMap<>();QPartyOrgDeclareInformation partyOrgDeclareInformation &#61; QPartyOrgDeclareInformation.partyOrgDeclareInformation;QPartyOrgDeclareBasic partyOrgDeclareBasic &#61; QPartyOrgDeclareBasic.partyOrgDeclareBasic;// JPAQuery jpaQuery &#61; queryFactory.select(partyOrgDeclareInformation).from(partyOrgDeclareInformation)
// .leftJoin(partyOrgDeclareBasic)
// .on(partyOrgDeclareBasic.dzzSbxxId.eq(partyOrgDeclareInformation.id.toString()))
// .where(partyOrgDeclareInformation.id.in(dzzSbxxIds));int jpaQueryPageAllNum &#61; queryFactory.select(partyOrgDeclareInformation, partyOrgDeclareBasic).from(partyOrgDeclareInformation).innerJoin(partyOrgDeclareBasic).on(partyOrgDeclareBasic.dzzSbxxId.eq(partyOrgDeclareInformation.id.stringValue())).where(partyOrgDeclareInformation.id.in(dzzSbxxIds)).where(partyOrgDeclareBasic.dzzJbxxId.eq(dzzJbxxId)).fetch().size();JPAQuery jpaQuery &#61; queryFactory.select(partyOrgDeclareInformation, partyOrgDeclareBasic).from(partyOrgDeclareInformation).innerJoin(partyOrgDeclareBasic).on(partyOrgDeclareBasic.dzzSbxxId.eq(partyOrgDeclareInformation.id.stringValue())).where(partyOrgDeclareInformation.id.in(dzzSbxxIds)).where(partyOrgDeclareBasic.dzzJbxxId.eq(dzzJbxxId)).offset(pageNo).limit(pageSize);List tuples &#61; jpaQuery.fetch();List voList &#61; new ArrayList<>();if(null !&#61; tuples && !tuples.isEmpty()){for(Tuple tuple:tuples){PartyOrgDeclareInformation partyOrgDeclareInformationResult &#61; tuple.get(0, PartyOrgDeclareInformation.class);PartyOrgDeclareBasic partyOrgDeclareBasicResult &#61; tuple.get(1, PartyOrgDeclareBasic.class);PartyOrgDeclareInformationVo vo &#61; new PartyOrgDeclareInformationVo();// 1- 申报信息vo.setId(partyOrgDeclareInformationResult.getId());vo.setDeclarationTypeName(partyOrgDeclareInformationResult.getDeclarationTypeName());vo.setDeclarationItem(partyOrgDeclareInformationResult.getDeclarationItem());vo.setDeclarationTime(partyOrgDeclareInformationResult.getDeclarationTime());vo.setDeclarer(partyOrgDeclareInformationResult.getDeclarer());vo.setDeclarationOrg(partyOrgDeclareInformationResult.getDeclarationOrg());vo.setAuditResults(partyOrgDeclareInformationResult.getAuditResults());// 2- 申报联合信息vo.setAuditStatus(partyOrgDeclareBasicResult.getAuditStatus());vo.setAuditStatusName(partyOrgDeclareBasicResult.getAuditStatusName());vo.setAuditResultsTime(partyOrgDeclareBasicResult.getAuditResultsTime());vo.setDzzJbxxId(Long.valueOf(partyOrgDeclareBasicResult.getDzzJbxxId()));voList.add(vo);}}result.put("pageAllNum", jpaQueryPageAllNum);result.put("voList", voList);return result;}}

知识点

Vue

路由跳转&#xff1a;

this.$router.push({ path: &#39;/partyAffairsManager/partyOrgLifeManager&#39;, query: { activeName: &#39;partyClassRegistration&#39;, show: true } });

 

常见问题

Swagger相关

问题描述&#xff1a;

1.主表设置一对多的实体类对应关系&#64;OneToMany&#xff1b;

2.swagger扫描对应的包路径&#xff1b;

报错问题&#xff1a;

项目启动报错&#xff0c;注释掉一对多关系后&#xff0c;可正常启动。

at springfox.documentation.spring.web.readers.parameter.ModelAttributeParameterExpander.expand(ModelAttributeParameterExpander.java:110) ~[springfox-spring-web-2.6.1.jar:2.6.1]

解决办法&#xff1a;

 

数据报错 JPA 多对一属性 persist出错

问题描述&#xff1a;

1.从表设置多对一关系&#64;ManyToOne

报错问题&#xff1a;

进行数据保存时报错。

detached entity passed to persis

解决方法&#xff1a;

 

&#64;Query 注解动态查询无法使用LIMIT关键词

JPQL和原生的SQL&#xff0c;JPQL没有LIMIT关键词

 

Vue Element-ui

相关命令&#xff1a;

# 安装
npm install
# 版本查询
npm ls element-ui
# 卸载
npm uninstall element-ui
# 重新安装
npm i element-ui -S
# 启动项目
npm run dev
# 安装指定版本
npm install element-ui&#64;2.3.7 -S

树型控件 Treeselect

https://vue-treeselect.js.org/#customize-key-names

# 安装命令
npm install --save &#64;riophae/vue-treeselect

时间控件 Moment

# 安装命令
npm install moment

 

Vue问题记录&#xff1a;

如果没有传递回显数据给表单对象&#xff0c;则回显时&#xff0c;表单控件如Select是点击无反应的。


转:https://my.oschina.net/discussjava/blog/1851188



推荐阅读
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • 本文讨论了如何使用Web.Config进行自定义配置节的配置转换。作者提到,他将msbuild设置为详细模式,但转换却忽略了带有替换转换的自定义部分的存在。 ... [详细]
  • ShiftLeft:将静态防护与运行时防护结合的持续性安全防护解决方案
    ShiftLeft公司是一家致力于将应用的静态防护和运行时防护与应用开发自动化工作流相结合以提升软件开发生命周期中的安全性的公司。传统的安全防护方式存在误报率高、人工成本高、耗时长等问题,而ShiftLeft提供的持续性安全防护解决方案能够解决这些问题。通过将下一代静态代码分析与应用开发自动化工作流中涉及的安全工具相结合,ShiftLeft帮助企业实现DevSecOps的安全部分,提供高效、准确的安全能力。 ... [详细]
  • 本文介绍了在Android Studio中使用命令行build gradle的方法,并解决了一些常见问题,包括手动配置gradle环境变量和解决External Native Build Issues的方法。同时提供了相关参考文章链接。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • uniapp开发H5解决跨域问题的两种代理方法
    本文介绍了uniapp开发H5解决跨域问题的两种代理方法,分别是在manifest.json文件和vue.config.js文件中设置代理。通过设置代理根域名和配置路径别名,可以实现H5页面的跨域访问。同时还介绍了如何开启内网穿透,让外网的人可以访问到本地调试的H5页面。 ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • Jboss的EJB部署描述符standardjaws.xml配置步骤详解
    本文详细介绍了Jboss的EJB部署描述符standardjaws.xml的配置步骤,包括映射CMP实体EJB、数据源连接池的获取以及数据库配置等内容。 ... [详细]
author-avatar
拍友2702932701
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有