上次简单介绍了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注解限制了name和email必须不能同时相同的限制。
此类所生成的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); }
} |