`
wsc830719
  • 浏览: 166062 次
  • 性别: Icon_minigender_1
  • 来自: 唐山
社区版块
存档分类
最新评论

netbeans(2):对JPA的支持

阅读更多

系列文章之2:netbeans对jpa的支持

内容要点:1 实体向导的逆向正向支持 2 JPA控制器类的生成 以及定制spring下的服务类的模板

概括起来2点:

1 反向支持

2 正向支持

 

详细:

1 反向支持,即逆向工程

   当设计好数据库以后,就可以选择面板里的从数据库里生成实体类了。

netbeans对mysql的支持非常好,生成的代码基本一个字不用改就能用了。sql server的只需改一个地方,就是添加主键的生成方式。就是复制一句 @GeneratedValue(strategy = GenerationType.AUTO)

不知是否是故意的,不过这样确实促进使用mysql。

 

缺点:可控制性不是很好,主要是字段名字可能不是自己期望的。当然了,自己随便改,因为生成的实体类里有字段的映射属性。也就是说,如果想复合自己的意愿,还是需要改动代码的。除非建立数据库时,字段名字就考虑使用规范好的。

 

2 正向支持

 

通过面板,创建实体类。 推荐这种做法,尤其学习的话,使用这个,能锻炼OO的编程能力。然后让框架自动创建数据库表。

2.1 通过向导 -----创建实体类

输入名称如 SaleOrder ,将生成如下代码,剩下就是自己添加多余的属性了。

@Entity
public class SaleOrder implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    public Integer getId() {
        return id;
    }

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

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof SaleOrder)) {
            return false;
        }
        SaleOrder other = (SaleOrder) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "com.test.SaleOrder[id=" + id + "]";
    }

}

 比如添加订单总价:

private BigDecimal totalPrice;

注意:这里无需加注释,默认的就是@Column。可以充分利用默许方式。

完整的代码可以参考如下: 其他属性可以自己添加

@Entity
public class SaleOrder implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    private BigDecimal totalPrice;

    public Integer getId() {
        return id;
    }

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

    public BigDecimal getTotalPrice() {
        return totalPrice;
    }

    public void setTotalPrice(BigDecimal totalPrice) {
        this.totalPrice = totalPrice;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof SaleOrder)) {
            return false;
        }
        SaleOrder other = (SaleOrder) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "com.test.SaleOrder[id=" + id + "]";
    }

}

 2.2 创建订单明细它与上面的订单是多对一关系

面板--创建实体类代码如下:

@Entity
public class OrderItem implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    public Integer getId() {
        return id;
    }

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

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof OrderItem)) {
            return false;
        }
        OrderItem other = (OrderItem) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "com.test.OrderItem[id=" + id + "]";
    }

}

 建立他们间的关联:

在上面的类文件里输入

 private SaleOrder saleOrder;

看截图:

 

 左边有个黄色叹号,点击,提示生成实体映射关系:看截图:

 选择创建双向ManyToOne关系,弹出设置属性,即SaleOrder 里用来与many对应的字段的名称,输入名称即会生成代码。

生成后的代码这里省略了。

 

最后总结2点:

 

1 一般的字段不需要加上注释,比如@Column除非是string的字段限制长度,默认是255,如果对性能要求不苛刻,那就万事都可省呀。

2 netbeans自动创建实体间映射。

 

 2.3 生成实体控制器

面板————生成实体控制器类

 

 添加要生成的实体:这里演示,我只添加SaleOrder,生成代码如下:

public class SaleOrderJpaController {

    public SaleOrderJpaController() {
        emf = Persistence.createEntityManagerFactory("testtempletePU");
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(SaleOrder saleOrder) {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            em.persist(saleOrder);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(SaleOrder saleOrder) throws NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            saleOrder = em.merge(saleOrder);
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = saleOrder.getId();
                if (findSaleOrder(id) == null) {
                    throw new NonexistentEntityException("The saleOrder with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            SaleOrder saleOrder;
            try {
                saleOrder = em.getReference(SaleOrder.class, id);
                saleOrder.getId();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The saleOrder with id " + id + " no longer exists.", enfe);
            }
            em.remove(saleOrder);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<SaleOrder> findSaleOrderEntities() {
        return findSaleOrderEntities(true, -1, -1);
    }

    public List<SaleOrder> findSaleOrderEntities(int maxResults, int firstResult) {
        return findSaleOrderEntities(false, maxResults, firstResult);
    }

    private List<SaleOrder> findSaleOrderEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select object(o) from SaleOrder as o");
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public SaleOrder findSaleOrder(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(SaleOrder.class, id);
        } finally {
            em.close();
        }
    }

    public int getSaleOrderCount() {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select count(o) from SaleOrder as o");
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }

}

 可见,这代码适合单独使用JPA的环境。上面的方法名称不合意的话,可以动手修改模板。

工具---模板  找到持久性

选中 其下面的 基于实体类的JPA控制器,  这个它已经有的是不让你改的,选中它,在右边点复制,然后下面就会出来一个。重命名为 我的JPA控制器类:

 

然后,在编辑器中打开。发现是空白,持久性模块里的模板的扩展性做的不好,spring模块就可以自己编辑。

这里就当介绍一个方法吧,如何定制自己的模板,以便快速开发。

至于本文的这个问题,我想通过添加新插件来解决,当我做完善了,我再发文章。不过生成spring下的JPA服务类其实放在这里不如放在spring模块里,可能因此,netbeans开发组没给太多java持久性扩展模板支持。

下面我们打开spring的模板:

 

选中抽象控制器,然后复制,下面就出个新的,然后改名为JPA服务类,然后在编辑器中编辑。

小提示:看能不能扩展,看下原来那个能不能在编辑器中打开就知道了。,上面的Java持久性里的服务类是不能在编辑器中打开的。

我们照着改下:

package ${package};

</#if>
import org.springframework.web.servlet.mvc.SimpleFormController;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/** 
 *
 * @author ${user}
 */
@Service
@Transactional
public class ${name}ServiceBean extends DaoSupport<${name}> implements ${name}Service{

}

 

看到上面的DaoSupport以及实现的接口,我们的${name}就是向导里输入的名字,这里我们直接复制实体类名就可以了。DaoSupport是一个基础类,封装了每个实体类都具备的 添加 更新 删除 查询出List的功能。可以把这个类自己取个名字,打成jar包,固定下来,至于如何命名,那是自己的事情,但是千万别和人家的类库冲突了。

比如 打包成到 self.spring.service.base。 self代表自己的jar包。

在上述模板里加上:

self.spring.service.base.DaoSupport,

另外上面引入了注释

那么通过模板生成实体服务类时,就省去了这部分劳动了。是不是就等于提高效率了。

比如键入SaleOrder那么将生成如下代码:

package com.test.service;

import org.springframework.web.servlet.mvc.SimpleFormController;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional
public class SaleOrderServiceBean extends DaoSupport<SaleOrder> implements SaleOrderService{

}

 

好了,先到这里,不过有个问题,服务类不能和实体类放一起,否则输入名字时和实体类名相同,不能创建,因为服务类一般放在service这样命名的包中,因此,应该不用考虑这个问题。

上面的DaoSupport我还没打包,没添加到模板中。至于想生成方法,自己定制就可以了,总之,自己看着弄,适合自己就是最好的。

 

now!开始定制自己的IDE吧。由于我的水平有限,高级定制需要很长时间去学习与研究,不是短时间能具备的。但是通过定制已有模板,是最简单的提供效率的方法,它几乎不需要任何编程支持,仅仅改下模板就可以了。

如果有相关的文章,可以提供给我,万分感谢!共同进步。谢谢观看。。

 

 

 

 

 

 

 

 

0
0
分享到:
评论

相关推荐

    JPA+Netbeans6直接操作数据库

    在NetBeans 6中,支持JPA的集成使得开发者能够直接在IDE内进行数据库操作,大大提高了开发效率。 **J2EE(Java Platform, Enterprise Edition)**是Java技术的一个版本,专为构建企业级应用程序而设计。它包含一组...

    Netbeans 开发 JSF 2.0 入门学习,使用Primefaces 及JPA

    你可以从官方网站下载并安装最新版本的Netbeans,确保它包含了JSF和JPA的支持。 在创建新项目时,选择"Java Web"类别下的"JSF 2.0"应用模板。接着,设置项目名称和位置,Netbeans将自动为你创建所需的文件结构。...

    JPAJSFGlassFish03NetBeans:使用GlassFish的JPA,JSF和Arquillian演示的NetBeans版本

    使用GlassFish的JPA,JSF和Arquillian演示的NetBeans版本 演示JPA和Arquillian用法的示例代码 有关创建该项目的故事, 该演示代码的原始版本是在2014年为JSF中的一门课程创建的。 学生使用JSF和JDBC创建了Web电子...

    javaProject2TI:Java JPA和JSTL学校项目

    在 Netbeans 中创建一个名为 class_lastname_firstname_project2013 的 web 项目,例如:2Ti1_Mertens_Leen_project2013 湾使用 JPA 实现该类图的映射。 截止日期(通过托莱多的任务交付):2013 年 4 月 30 日,...

    SUN公司的JPA课件

    - **事务管理**:JPA支持事务管理,可以通过`EntityManager`或外部事务管理器控制事务的开始和结束。 #### 十一、嵌入式对象 - **定义**:嵌入式对象是指作为另一个实体的一部分存储的对象,通常不具有独立的主键...

    netbeans6.1英文版

    1. **Java EE 支持**:NetBeans 6.1增强了对Java EE的支持,包括EJB 3.0、JPA 1.0、JSF 1.2等技术栈的支持,使得开发者可以更高效地开发企业级应用。 2. **Web 2.0开发工具**:该版本加强了对Web 2.0应用的支持,...

    一步一步教你用netbeans做程序

    作者在开始时感到很难,但最终发现NetBeans非常易于使用,且支持中文开发。这个描述部分表明了作者的亲身体验和使用NetBeans的初步印象。 标签解读 标签“netbeans”表明了本文的主题是NetBeans开发环境。 部分...

    基于JPA的CRUD例子

    **基于JPA的CRUD操作详解** ...这个“基于JPA的CRUD例子”就是对这一特性的简单演示,展示了如何利用JPA进行基本的数据管理。通过深入理解和实践,开发者可以更好地利用JPA来构建高效、可维护的Java应用程序。

    NetBeans下jboss seam开发入门

    而NetBeans作为一款功能丰富的集成开发环境(IDE),对Java开发提供了广泛的支持,包括对jBoss Seam的完美集成。下面我们将详细探讨如何在NetBeans中进行jBoss Seam的开发。 1. **安装准备**: 在开始开发前,确保...

    NETBEANS7下J2EE6开发技术-英文

    9. **NETBEANS与J2EE 6的集成**:NETBEANS 7提供了对J2EE 6的完整支持,包括项目模板、自动部署、调试工具等,使得开发者能够在IDE内完成整个J2EE应用的生命周期管理。 通过阅读《NETBEANS7下J2EE6开发技术》这份...

    netbeans-8.0.2-javaee-windows

    - NetBeans 8.0.2 提供了对Java EE 7的全面支持,包括Servlet、JSP、JSF、EJB、JMS、JPA等框架和技术。 - 用户可以创建、编辑、调试和部署基于Java EE的应用程序,无需离开IDE。 - 内置的服务器支持包括GlassFish...

    Create a Java EE 6 Application with JSF 2, EJB 3.1, JPA, and NetBeans IDE 7

    NetBeans IDE 7.3作为开发和部署工具,它提供了对Java EE 6的全面支持,包括JSF、EJB和JPA的集成开发环境。IDE的可视化工具使得创建和配置这些组件变得简单易行。此外,由于我们将使用Glassfish内置的数据库服务器...

    Java持久性API(JPA)

    通过使用JPA,开发者可以减少对底层SQL查询的关注,从而更加专注于业务逻辑的实现。 #### 二、核心概念 1. **实体(Entity)**:代表数据库中的表,通常用Java类表示。 2. **持久上下文(Persistence Context)**:持久...

    NetBeans_PostgreSQL

    除了上述基本操作,NetBeans还支持通过JPA(Java Persistence API)进行对象关系映射,这使得在Java应用程序中操作数据库变得更加便捷。你可以创建实体类来代表数据库表,然后利用NetBeans的代码生成工具自动生成...

    NetBeans——Java桌面、Web与企业级程序开发详解

    - **Java EE集成**:对于Java EE(Enterprise Edition)项目,NetBeans支持包括JPA(Java Persistence API)、JMS(Java Message Service)和JAX-RS(Java API for RESTful Web Services)等多种标准。 - **...

    netbeans实例包(包含多个常用实例)

    3. **Java EE应用**:对于企业级开发,NetBeans支持Java EE平台,如EJB、JPA和Spring框架。实例可能包括构建MVC架构的项目,使用EJB进行业务逻辑处理,以及JPA进行持久化操作。 4. **PHP开发**:NetBeans对PHP...

    netbeans 7.x 如何產生 jpa metamodel 1

    然而,Netbeans 7.x 的默认界面并不直接支持生成JPA Entity对应的Metamodel类。本文将介绍如何通过Netbeans手动设置和配置,以自动生成这些Metamodel类。 ### 为何需要JPA Metamodel JPA Metamodel的主要作用在于...

    javaee jsf+ejb+jpa

    开发者可以通过解压并导入到IDE(如Eclipse或NetBeans)中,进行进一步的学习和调试。 这个项目是一个很好的学习资源,因为它涵盖了JavaEE开发中的关键部分,从用户交互到业务处理再到数据存储。通过分析和理解这个...

    02_传智播客JPA详解_JPA开发环境和思想介绍

    2. **集成开发环境(IDE)**:如Eclipse、IntelliJ IDEA或NetBeans,它们都提供了对JPA的良好支持,可以通过插件轻松配置和使用JPA。 3. **Java Persistence Provider (JPA提供商)**:例如Hibernate、EclipseLink等,...

Global site tag (gtag.js) - Google Analytics