跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Struts 2 整合 Spring 与 JPA 实战(二):实体与服务层设计

Struts 2 整合 Spring 与 JPA 项目中构建 JPA 领域模型及服务层。通过定义 Person 实体类并配置持久化注解,实现数据映射。随后创建 PersonService 接口及其实现类,利用 Spring 事务管理完成增删改查操作。EntityManager 注入与事务控制确保了业务逻辑的正确执行。

极光发布于 2010/11/6更新于 2026/7/2449 浏览
Struts 2 整合 Spring 与 JPA 实战(二):实体与服务层设计

领域模型设计

我们的领域模型将包含一个简单的 Person 类,其中定义几个核心字段。

首先,新建一个名为 Person 的类,包名设为 quickstart.model。添加 id(int)、firstName(String)和 lastName(String)字段,并生成对应的 getter/setter 方法。

关键步骤是标记持久化属性:使用 @Entity 注解标识该类可被持久化,对 id 字段分别加上 @Id 和 @GeneratedValue 注解。这样 JPA 提供者(如 Hibernate)就能识别主键并自动生成 ID 值。默认情况下,类和字段会映射为同名的表与列。

package quickstart.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Person {
    @Id
    @GeneratedValue
    private Integer id;
    private String lastName;
    private String firstName;

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }
}

服务层实现

接下来编写处理 Person 对象 CRUD 操作的类。

先定义 PersonService 接口,位于 quickstart.service 包下,声明查询、保存、删除及查找的方法签名。

package quickstart.service;

import java.util.List;
import quickstart.model.Person;

public interface PersonService {
    List<Person> findAll();
    void save(Person person);
    void remove(int id);
    Person find(int id);
}

然后创建实现类 PersonServiceImpl。这里需要引入 EntityManager 进行数据库交互,并利用 Spring 的事务管理特性。

package quickstart.service;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.springframework.transaction.annotation.Transactional;
import quickstart.model.Person;

@Transactional
public class PersonServiceImpl implements PersonService {
    private EntityManager em;

    @PersistenceContext
    public void setEntityManager(EntityManager em) {
        this.em = em;
    }

    @SuppressWarnings("unchecked")
    public List<Person> findAll() {
        Query query = getEntityManager().createQuery("select p FROM Person p");
        return query.getResultList();
    }

    public void save(Person person) {
        if (person.getId() == null) {
            // 新增
            em.persist(person);
        } else {
            // 更新
            em.merge(person);
        }
    }

    public void remove(int id) {
        Person person = find(id);
        if (person != null) {
            em.remove(person);
        }
    }

    private EntityManager getEntityManager() {
        return em;
    }

    public Person find(int id) {
        return em.find(Person.class, id);
    }
}

注意 @PersistenceContext 注解会让 Spring 在实例化时自动注入 EntityManager,它可以放在字段或 setter 方法上。配合 @Transactional 注解,Spring 会确保这些方法在事务环境中运行,保证数据一致性。

目录

  1. 领域模型设计
  2. 服务层实现
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • GitMCP:将 GitHub 代码库变为实时文档中心的 MCP 工具,消除 AI 代码幻觉
  • Spring IoC 核心原理与依赖注入实战
  • GitHub Copilot 学生身份认证与免费开通指南
  • AIGC 背后的深度学习魔法:从原理到实践
  • Spring Boot 配置文件实战:从 Properties 到 YAML 的取舍
  • JWT 漏洞原理与 WebGoat 第六、十一关实战解析
  • Redis 核心数据结构:String 类型深度解析与 C++ 实战
  • AJAX 与 Fetch:异步 Web 请求实战对比
  • Linux 进程间通信进阶:管道与共享内存
  • Gitee 轻量级 PR:降低开源贡献门槛的便捷方式
  • C++ 二叉搜索树简单实现:增删查改全攻略
  • ClawX 可视化 AI 智能体使用指南
  • OpenClaw Web Search 配置与渠道选择指南
  • 使用 C++ 构建简单的 RTSP 流媒体转发服务器
  • OpenClaw QQ 机器人接入完整指南
  • 人工智能时代的产品经理:挑战、机遇与转型路径
  • C++ 二叉搜索树(BST)核心原理与实现
  • Python 数据采集与处理实战:从网络爬虫到 Excel 存储
  • 网络安全基础与黑客技术入门知识详解
  • Xilinx 7 系列 FPGA 在线升级调试枢纽模块解析

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online