Java EE 5.0 实战教程 第二部分:JPA Entity编程(域建模)
2008-06-18 10:40:02

查看(
8 ) /

评论(
0 )
域建模是每个面向对象应用程序的核心,就像人的骨骼,如果骨骼都没有,什么界面呀,数据呀都无处可靠。在JPA之前,Java EE程序需要一套域建模,还需要一套类似的Entity Bean来处理Persistence,因为Entity Bean是和EJB容器相关的,不能运用在容器之外,这样就产生了重复,而重复是程序维护的恶梦,每一个改变都需要做多处的修改,一个不小心少改了一个地方就会产生莫名其妙的错误。JPA的出现使这个问题得到解决,JPA里的Entity可以和Persistence Context剥离从而可以象普通的Java类一样使用,详见讲稿Java Persistence API。
-
根据以下的类图建立域建模,这的模型做了简化,目的是演示Java EE 5.0的开发,若需要更多的功能,读者可根据自己的需要进一步丰富数据模型。

-
Stock.java. 注意Stock.java是一个POJO,也就是最普通的Java类,通过加入@Entity注解使其变成了JPA的Entity。详见Java Persistence API教程。
package entities;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Stock implements java.io.Serializable {
@Id private String stockCode;
private String stockName;
/** Creates a new instance of Stock */
public Stock() {
}
public String getStockCode() {
return stockCode;
}
public void setStockCode(String stockCode) {
this.stockCode = stockCode;
}
public String getStockName() {
return stockName;
}
public void setStockName(String stockName) {
this.stockName = stockName;
}
}
|
-
Trade.java. 注意Trade类应用了@ManyToOne注解来确定和别的Entity的关系。详见详见Java Persistence API教程。
package entities;
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@Entity()
public class Trade implements java.io.Serializable {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@ManyToOne
private Stock stock;
private long shareNum;
private double price;
@ManyToOne
private TradeType type;
/** Creates a new instance of Trade */
public Trade() {
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Stock getStock() {
return stock;
}
public void setStock(Stock stock) {
this.stock = stock;
}
public long getShareNum() {
return shareNum;
}
public void setShareNum(long shareNum) {
this.shareNum = shareNum;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public TradeType getType() {
return type;
}
public void setType(TradeType type) {
this.type = type;
}
}
|
-
Holding.java.
package entities;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToOne;
@Entity()
public class Holding implements java.io.Serializable {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@OneToOne
private Stock stock;
private long shareNum;
private double averageCost;
/** Creates a new instance of Holding */
public Holding() {
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Stock getStock() {
return stock;
}
public void setStock(Stock stock) {
this.stock = stock;
}
public long getShareNum() {
return shareNum;
}
public void setShareNum(long shareNum) {
this.shareNum = shareNum;
}
public double getAverageCost() {
return averageCost;
}
public void setAverageCost(double averageCost) {
this.averageCost = averageCost;
}
}
|
-
TradeType.java.
package entities;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity()
public class TradeType implements java.io.Serializable {
@Id
private int typeCode;
private String description;
public TradeType() {
}
public TradeType(int code) {
this.typeCode = code;
}
public TradeType(int code, String description){
this.setTypeCode(code);
this.setDescription(description);
}
public static TradeType BUY = new TradeType(1, "Buy");
public static TradeType SELL = new TradeType(2, "Sell");
public int getTypeCode() {
return typeCode;
}
public void setTypeCode(int typeCode) {
this.typeCode = typeCode;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public boolean equals(Object obj) {
if(!(obj instanceof TradeType)){
return false;
}
TradeType theType = (TradeType) obj;
if(theType.getTypeCode() == getTypeCode()){
return true;
} else {
return false;
}
}
}
|
-
读者可用拷贝的方式将这四个java类拷到NetBeans里。也可自己输入,NetBeans提供了丰富的编辑功能,象代码自动完成,实体模板及字段封装可帮助你快速地输入源代码。
-
建立持久性单元。持久性单元是JPA运行环境和物理数据库的连接,一旦指定了持久性单元,JPA运行环境就会自动地在指定的数据库里存储和提取数据。详见Java Persistence API教程。在创建持久性单元时,NetBeans还提供了一个工具,可方便地根据Entities来生成数据库表格,见c
-
-
右键“StockApp-ejb”,选“新建”-“文件/文件夹…”

-
-
在对话框里选“持久性”, “持久性单元”,点击“下一步”。

-
-
在“数据源”一项填入 jdbc/stockDS(注意大小写,和前面必须一致), 并选择“创建”,然后点击“完成”。NetBeans提供了三种表生成策略:
-
创建:在部署项目时生成和Entity对印的数据表格
-
删除并创建:部署项目时生成表格,并在取消项目部署时删除表格 ,这个选项在开发初期,数据结构改动较多时特别有用。
-
无:不进行表格生成的操作。

-
建立一个会话Bean。这个会话Bean暂时不用,但必须存在,否则下一步部署项目时会出错。
-
部署项目。右键“StockApp”,选择“部署项目”。

-
NetBeans自动部署项目完成后,切换到“运行环境”,展开“数据库”,连接上“…./stockDB”(用户名/密码: stock/stock, 还记得第一部分准备的数据库吗?),打开“表”目录,可看到四个表:Stock, Trade, Holding和TradeType,这是NetBeans根据之前定义的Entities自动生成的。

-
接下来需要在TRADETYPE表里加入两个常量,可通过NetBeans的数据库工具来完成。
-
右键“TRADETYPE”,选择“执行命令…”.

-
-
在打开的“SQL 命令1”窗口里敲入以下命令,并按
执行。
insert into tradetype values(1, 'Buy');
insert into tradetype values(2, 'Sell');
|

-
-
在输出框里,可看见以下输出
在 0.062 秒内成功执行,但 1 行受到影响。
第 1 行,第 1 列
在 0 秒内成功执行,但 1 行受到影响。
第 3 行,第 1 列
0.062 秒后执行完毕,出现 0 个错误。
|
-
至此,Entity编程完毕,下面我们就可以用这些Entity来编写业务逻辑和页面了。
附录
有人会问了,你在这部分里介绍的是先编好JPA Entity然后再根据Entity生成数据库表格,如果我的项目不是新项目,只能使用已有的数据库表格,怎么办呢?别急,NetBeans提供了一个工具,可以根据数据库表格逆向生成JPA Entities。具体做法如下:
-
新建一个项目,常规或企业项目均可。
-
右键此项目,选择”新建”-“文件/文件夹…”

-
在对话框里选择“持久性” ,“通过数据库生成实体类”,然后“下一步”

-
选择你要操作的数据库连接,NetBeans会根据数据库连接提取出可用表,你可全选可用表或者是部分你感兴趣的表,然后“下一步”

-
NetBeans会根据表的名称自动给出实体类名,你可以根据需要做修改。然后指定类生成的位置和包。NetBeans还给一个机会让你创建持久性单元。最后点“完成”,NetBeans就会自动生成实体类。

-
生成的Trade.java的例子。看起来比我们自己编的还好,连NamedQuery都给做好了,注解的运用也规范多了。
…….
@Entity
@Table(name = "TRADE")
@NamedQueries( {
@NamedQuery(name = "Trade.findById", query = "SELECT t FROM Trade t WHERE t.id = :id"),
@NamedQuery(name = "Trade.findByPrice", query = "SELECT t FROM Trade t WHERE t.price = :price"),
@NamedQuery(name = "Trade.findByTradingdate", query = "SELECT t FROM Trade t WHERE t.tradingdate = :tradingdate"),
@NamedQuery(name = "Trade.findBySharenum", query = "SELECT t FROM Trade t WHERE t.sharenum = :sharenum")
})
public class Trade implements Serializable {
@Id
@Column(name = "ID", nullable = false)
private BigInteger id;
@Column(name = "PRICE")
private Double price;
@Column(name = "TRADINGDATE")
@Temporal(TemporalType.DATE)
private Date tradingdate;
@Column(name = "SHARENUM")
private BigInteger sharenum;
@JoinColumn(name = "STOCK_STOCKCODE", referencedColumnName = "STOCKCODE")
@ManyToOne
private Stock stockStockcode;
@JoinColumn(name = "TYPE_TYPECODE", referencedColumnName = "TYPECODE")
@ManyToOne
private Tradetype typeTypecode;
…….
|
分享到:
相关推荐
基于 OpenCV 的魔兽世界钓鱼机器人
供应链管理中信息共享问题的研究
青春文学中的爱情观呈现
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
XLSReadWriteII6.02.01.7z
图解系统-小林coding-v1.0
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
漫画作品与乌托邦理想追求
江苏建筑消防设施维护保养规程.rar
内容概要:论文介绍了一款名为DODRIO的交互式可视化工具,帮助自然语言处理(NLP)研究人员和从业者解析基于转换器架构的语言模型内部工作机理。DODRIO整合了概述图与详尽视图,支持用户比较注意力权重与其输入文本的句法结构和语义特征。具体而言,它包含了依赖关系视图(Dependency View)、语义关注图(Semantic Attention Graph)以及注意力头概览(Attention Head Overview),并利用不同的图形展示方法使复杂的多层多头转换器模型中的注意力模式更容易理解和研究。 适用人群:适用于从事深度学习、自然语言处理的研究人员和技术从业者;尤其适合对基于变换器架构的大规模预训练语言模型感兴趣的开发者们。 使用场景及目标:DODRIO用于探索转换器模型各层级之间的联系、验证已有研究成果,同时激发新假设形成。具体使用时可以选择特定数据集中的句子作为样本输入,观察不同注意力机制如何响应文本内容的变化。此外,还可以用来对比精简版本DistilBERT的表现,评估其相对全量模型BERT的优势与不足。 其他说明:DODRIO为开源项目,提供web端实施方式,使得
该代码使用scikit-learn的乳腺癌数据集,完成分类模型训练与评估全流程。主要功能包括:数据标准化、三类模型(逻辑回归、随机森林、SVM)的训练、模型性能评估(分类报告、混淆矩阵、ROC曲线)、随机森林特征重要性分析及学习曲线可视化。通过`train_test_split`划分数据集,`StandardScaler`标准化特征,循环遍历模型进行统一训练和评估。关键实现细节包含:利用`classification_report`输出精确度/召回率等指标,绘制混淆矩阵和ROC曲线量化模型效果,随机森林的特征重要性通过柱状图展示,学习曲线分析模型随训练样本变化的拟合趋势。最终将原始数据和预测结果保存为CSV文件,便于后续分析,并通过matplotlib进行多维度可视化比较。代码结构清晰,实现了数据处理、模型训练、评估与可视化的整合,适用于乳腺癌分类任务的多模型对比分析。
在智慧城市建设的大潮中,智慧园区作为其中的璀璨明珠,正以其独特的魅力引领着产业园区的新一轮变革。想象一下,一个集绿色、高端、智能、创新于一体的未来园区,它不仅融合了科技研发、商业居住、办公文创等多种功能,更通过深度应用信息技术,实现了从传统到智慧的华丽转身。 智慧园区通过“四化”建设——即园区运营精细化、园区体验智能化、园区服务专业化和园区设施信息化,彻底颠覆了传统园区的管理模式。在这里,基础设施的数据收集与分析让管理变得更加主动和高效,从温湿度监控到烟雾报警,从消防水箱液位监测到消防栓防盗水装置,每一处细节都彰显着智能的力量。而远程抄表、空调和变配电的智能化管控,更是在节能降耗的同时,极大地提升了园区的运维效率。更令人兴奋的是,通过智慧监控、人流统计和自动访客系统等高科技手段,园区的安全防范能力得到了质的飞跃,让每一位入驻企业和个人都能享受到“拎包入住”般的便捷与安心。 更令人瞩目的是,智慧园区还构建了集信息服务、企业服务、物业服务于一体的综合服务体系。无论是通过园区门户进行信息查询、投诉反馈,还是享受便捷的电商服务、法律咨询和融资支持,亦或是利用云ERP和云OA系统提升企业的管理水平和运营效率,智慧园区都以其全面、专业、高效的服务,为企业的发展插上了腾飞的翅膀。而这一切的背后,是大数据、云计算、人工智能等前沿技术的深度融合与应用,它们如同智慧的大脑,让园区的管理和服务变得更加聪明、更加贴心。走进智慧园区,就像踏入了一个充满无限可能的未来世界,这里不仅有科技的魅力,更有生活的温度,让人不禁对未来充满了无限的憧憬与期待。
内容概要:本文档介绍了基于MATLAB实现的贝叶斯优化(BO)、Transformer和GRU相结合的多特征分类预测项目实例,涵盖了详细的程序设计思路和具体代码实现。项目旨在应对数据的多样性与复杂性,提供一种更高效的多特征数据分类解决方案。文档主要内容包括:项目背景与意义,技术难点与解决方案,具体的实施流程如数据处理、模型构建与优化、超参数调优、性能评估以及精美的GUI设计;详细说明了Transformer和GRU在多特征数据分类中的应用及其与贝叶斯优化的有效结合,强调了其理论与实际应用中的价值。 适合人群:具备一定机器学习和MATLAB编程基础的研发人员,特别是从事多维数据处理与预测工作的专业人士和技术爱好者。 使用场景及目标:① 适用于金融、医疗、交通等行业,进行复杂的多维数据处理和预测任务;② 提升现有分类任务中复杂数据处理的准确度和效率,为各行业提供智能预测工具,如金融市场预测、患者病情发展跟踪、交通流量管理等。 其他说明:本文档包含了丰富的实战案例和技术细节,不仅限于模型设计本身,还涉及到数据清洗、模型优化等方面的知识,帮助使用者深入理解每一步骤背后的原理与实现方法。通过完整的代码样例和GUI界面设计指导,读者可以从头到尾跟随文档搭建起一套成熟的分类预测系统。
大数据的sql练习题,初级中级高级
内容概要:论文介绍了名为Transformer的新网络架构,它完全基于自注意力机制,在不使用递归或卷积神经网络的情况下建模输入与输出之间的全局依赖关系,尤其适用于长文本处理。通过多头自注意力层和平行化的全连接前馈网络,使得在机器翻译任务上的表现优于当时最佳模型。具体地,作者用此方法实现了对英语-德语和英语-法语翻译、句法解析等任务的高度并行化计算,并取得显著效果。在实验方面,Transformer在较短训练时间内获得了高质量的翻译结果以及新的单一模型基准。除此之外,研究人员还探索了模型变体的效果及其对于不同参数变化时性能的变化。 适用人群:从事自然语言处理领域的研究者、工程师、学生,熟悉深度学习概念尤其是编码器-解码器模型以及关注模型创新的人士。 使用场景及目标:主要适用于序列到序列(seq2seq)转换任务如机器翻译、语法分析、阅读理解和总结等任务的研究和技术开发;目标在于提高计算效率、缩短训练时间的同时确保模型性能达到或超过现有技术。 其他说明:本文不仅提出了一个新的模型思路,更重要的是展示了自注意力机制相较于传统LSTM或其他方式所拥有的优势,例如更好地捕捉远距离上下文关系的能力
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
自己写的远控木马,欢迎各位大佬改善