JPA学习笔记-EJB-02JPA属性注解--1

上次简单介绍了JPA的基本部署和操作过程,算是认识JPA了,下面我们继续学习JPA吧,我们从JPA的注解标记@Table@Column开始逐渐介绍。

@Table标签介绍:

@Table标签和@Entity一样都是标记在类的前面,这个标签代表了该标记的实体类与数据库中表的关联。

如下实体代码:

package eo;

 

import java.io.Serializable;

 

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.Id;

import javax.persistence.Table;

import javax.persistence.UniqueConstraint;

 

/**

 * 映射到tb_contact<br>

 * name字段和email字段的值不能同时相同<br>

 * ejbjpa是对应的数据库名

 *

 * @author 刘岩

 */

@Entity

@Table(name = "tb_contact", schema = "ejbjpa", uniqueConstraints = { @UniqueConstraint(columnNames = {

       "name", "email" }) })

public class ContactEO implements Serializable {

 

    public ContactEO() {

       super();

    }

 

    @Id

    private Integer id;

 

    @Column

    private String name;

 

    @Column

    private String email;

 

    public Integer getId() {

       return id;

    }

 

    public void setId(Integer id) {

       this.id = id;

    }

 

    public String getName() {

       return name;

    }

 

    public void setName(String name) {

       this.name = name;

    }

 

    public String getEmail() {

       return email;

    }

 

    public void setEmail(String email) {

       this.email = email;

    }

}

注释对于@Table标签的说明已经很明白了,name说明了数据库的表名,schema是数据库的名称,uniqueConstraints是唯一性限制,里面通过@UniqueConstraint注解限制了nameemail必须不能同时相同的限制。

此类所生成的sql脚本为:

CREATE TABLE `NewTable` (

`id`  int(11) NOT NULL ,

`name`  varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,

`email`  varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,

PRIMARY KEY (`id`),

UNIQUE INDEX `name` USING BTREE (`name`) ,

UNIQUE INDEX `email` USING BTREE (`email`)

)

ENGINE=InnoDB

DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci

ROW_FORMAT=COMPACT

;

下面介绍,也是最常用的@Column注解,它就是标注在实体类的属性上或者getXXX()前面的,主要就是映射实体属性和数据库的字段的。

一般的字段注解就不用说了,上面的代码已经展现了,我们用一些其他的注解属性看看,代码如下:

@Column(name = "mess", nullable = false, length = 300, unique = false)

    private String message;

 

    @Column(precision = 12, scale = 2)

    private Double price;

 

    @Lob

    @Basic(fetch = FetchType.LAZY)

    @Column(name = "picture")

    private byte[] picture;

message属性映射到了数据库的mess字段,不能为空,长度为300字符,并且默认的就是可以不唯一;price是双精度字段,长度为12,精度为2(像9187219100.22是有效的值);picture是存储二进制文件的字段,一般存储图片这种流信息,所以在加载策略上也用到了@Basic(fetch = FetchType.LAZY),代表懒加载,提高查询效率。

那么这3个新的属性在sql语句中create的体现就是:

`mess`  varchar(300) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,

`price`  double(12,2) NULL DEFAULT NULL ,

`picture`  blob NULL DEFAULT NULL ,

下面我们自己写一个DAO类来操作ContactEO这个实体。

DAO接口和实现类代码如下:

接口

package dao;

 

import javax.ejb.Remote;

import eo.ContactEO;

 

/**

 * ContactEO操作接口

 * @author 刘岩

 */

@Remote

public interface IContactService {

   

    public void saveContact(ContactEO contactEO);

   

}

实现类

package dao.impl;

 

import javax.ejb.Stateless;

import javax.persistence.EntityManager;

import javax.persistence.PersistenceContext;

 

import dao.IContactService;

import eo.ContactEO;

 

/**

 * 实现类

 * @author 刘岩

 */

@Stateless

public class ContactServiceImpl implements IContactService {

   

    @PersistenceContext(unitName = "JPAEJBPU")

    private EntityManager entityManager;

   

    @Override

    public void saveContact(ContactEO contactEO) {

       entityManager.persist(contactEO);

    }

 

}

你可能感兴趣的:(DAO,sql,jpa,ejb,脚本)