`
conkeyn
  • 浏览: 1524505 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

JPA 注解(一)

阅读更多

1、 @Entity(name="EntityName")

      表示该类是一个可持化的实体。当在容器中时,服务器将会首先加载所有标注了@Entity注释的实体类,其中@Entity中的“name”属性表示实体名称,若不作设置,默认为标注实体类的名称(注意大小写与系统的关系。)。 @Entity标注是必需的 ,name属性为可选。 

@Entity(name="person_1")
public class Person implements Serializable {
	
	
	public Person(){
		id=System.currentTimeMillis();
	}

	public Person(Long id){
		this.id = id;
	}
}
 

 @Entity标注的实体类至少需要有一个无参的构造方法。这是因为,在使用类反射机制 Class.newInstance()方法创建实例时,必需要有一个默认的无参数构造方法,否则会执出实例化异常(InstantiationException)。

   如果指定name属性后,在执行JPQL时应该使用name属性所指的名称。像上面的标注后,在执行JPQL时要像下面这样:

SELECT p FROM person_1 AS p

 name属性为默认值时就使用类名称:

SELECT p FROM Person AS p; 

    有两点须要注意:

      (1)实体可继承,非实体类可以继承自实体类,实体类也要中以继承自非实类。

      (2)抽象类(abstract)也可以标注为实体类。

 

2、@Table

     在使用@Table标记时,需要注意以下几个问题。

     (1) 此标记需要标注在类名前,不能标注在方法或属性前。

     (2) name 属性表示实体所对应表的名称,默认表名为实体名称。

     (3) catalogschema 属性表示实体指定的目录名或数据库名,这个根据不同的数据类型有所不同。

     (4) uniqueConstraints 属性表示该实体所关联的唯一约束条件,一个实体可以有多个唯一的约束,默认没有约束条件。

     (5)若使用uniqueContraints 属性时,需要配合标记UniqueContraint标记来使用。

 

package model;

import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;

@Entity
@Table(name = "tb_contact", schema = "test", uniqueConstraints = { 
		@UniqueConstraint(columnNames = {"name", "email" }),
		@UniqueConstraint(columnNames = {"col1", "col2" })
})
public class ContactEO implements Serializable {

	private Long id;

	private String name;

	private String email;

	private String col1;

	private String col2;

}

 以上的@Table注释表示指定数据库名“test”,表名为“tb_contact”,并创建了两组唯一索引。


3、@Column

        @Column标记表示持久化属性映射表中的字段。此标记可以标注在Getter方法或属性前。

如标注在属性前

public class ContactEO implements Serializable {

	@Column(name = "name")
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

 或者标注在Getter方法前。

public class ContactEO implements Serializable {

	
	private String name;

    @Column(name = "name")
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

  (1) unique 属性表示该字段是否为唯一标识,默认为false。如果表中有一个字段需要唯一标识,则既可以使用@Column标记也可以使用@Table标记中的@UniqueConstraint。

  (2)nullable 属性表示该字段是否可以为null值,默认为true(允许为null值)。

  (3)insertable 属性表示在使用“INSERT” SQL语脚本插入数据时,是否需要插入该字段的值。

  (4)updatable 属性表示在使用“UPDATE”脚本插入数据时,是否需要更新该字段的值。insertable和updatable属性一般多用于只读属性,例如主键和外键等。这些字段值通常是自动生成的。

  (5)columnDefinition 属性表示创建表时,该字段创建的SQL语句,一般用于通过Entity生成表定义时使用。

  (6)table 属性表示当映射多个表时,指定表中的字段。默认值为主表的表名。

  (7)length 属性表示该字段的长度,当字段的类型为varchar时,该属性才有效,默认为255个字符。

  (8)precision 属性和scale 属性表示精度,当字段类型为double时,precision表示数值的总长度,scale表示小数点所占的位数。

示例一、

	private String name;

	@Column(name = "name",nullable=false,length=512)
	public String getName() {
		return name;
	}

 生成的SQL脚本为

CREATE TABLE contact(
      id integer not null,
      name varchar(512) not null,
      primary key(id)
);

  示例二、为double型指定精度为12位,小数点位数为2位。

	private BigDecimal monthlyIncome;
	
	@Column(name="monthly_income",precision=12,scale=2)
	public BigDecimal getMonthlyIncome() {
		return monthlyIncome;
	}

	public void setMonthlyIncome(BigDecimal monthlyIncome) {
		this.monthlyIncome = monthlyIncome;
	}

 生成的SQL脚本为

CREATE TABLE contact(
      id integer not null,
      monthly_income double(12,2),
      primary key(id)
);

 示例三、自定义生成CLOB类型字段的SQL语句

	@Column(name = "contact_name",columnDefinition=" clob not null" )
	private String name;
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

  生成的SQL脚本为

CREATE TABLE contact(
      id integer not null,
      contact_name clob(200) not null,












      primary key(id)
);

  其中加粗的部份为columnDefinition属性设置的值。若不指定该属笥,通常使用默认的类型建表,若此时需要自定义建表的类型时,可以在该属性设置。

 

可持久化的数据类型

分类 类型
Java的基本数据类型 byte、int、short、long、boolean、char、float、double
Java的基本数据类型对应的封装类 Byte、Int、Short、Long、Boolean、Character、Float、Double
字节和字符型数组 byte[]、Byte[]、char[]、Character[]
大数值类型

java.math.BigInteger

java.math.BigDecimal
字符串类型 java.lang.String
日期时间类型

java.util.Date

java.util.Calendar

java.sql.Date

java.sql.Time

java.sql.Timestamp
枚举型 用户自定义的枚举型
Entity类型 标注为@Entity的类
包含Entity类型的集合Collection类

java.util.Collection

java.util.Set

java.util.List

java.util.Map
嵌入式(embeddable)类

 Java数据类型与数据库中的类型转换是由JPA实现框架自动转换的,所以不同的JPA实现框架转换的规则也不太一样。

     例如MySQL中,varchar和char类型都转化为String类型。Blob和Clob类型可以转化成Byte[]型。由于类型转化是JPA底层来实现的,这就遇到一个问题,很有可能在将表中的数据转换成Java的数据类型时出现异常。

       我们知道对于可以持久化的Java类型中,即可以映射基本的数据类型,如byte、int、short、long、boolean、char、float、double等,也可以映射成 Byte、Int、Short、Long、Boolean、Character、Float、 Double类型。那么选择哪种类型比较合适呢?

举下面的例子进行说明。

CREATE TABLE contact(
      id integer not null,
      monthly_income double(12,2),
      primary key(id)
);

      对于表字段id,它的值不能为null,所以映射成int型和Integer型都是可以的。

      但对于表字段monthly_income来说,它的值可能为null。当为null时,若此时java的Enity类的对应属性的类型int,则将一个null值转化成int型必定产生转换异。但此时java的Entity类对应的属性为Integer,它是一个对象,对象可以为null,所以不会产生问题。

4、@Basic

    在默认情况下,Entity中属笥加载方式都是即时加载(EAGER)的,当Enity对象实例化时,就加截了实体中相应的属性值。

    但对于一些特殊属笥,比如大文本型text、字节流型blob型的数据,在加载Entity时,这些属性对应的数据量比较大,有时创建实体时如果也加载的话,可能造成资源严重占用。那么就可以为这些特殊的实体属性设置加载方式为惰性加载(LAZY)

   (1)fetch属性表示获取值的方式,它的值定义的枚举型,可选值为LAZY、EAGER。其中EAGER表示即时加载、LAZY表示惰性加载。默认为即时加载。

   (2)optional表示属性是否可以为null,不能用于java基本数据型( byte、int、short、long、boolean、char、float、double )。

如:

	@Basic(fetch=FetchType.LAZY)
	@Column(name = "contact_name",columnDefinition=" clob not null" )
	private String name;
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

 

5、@Id

       主键是实体的唯一标识,调用EntityManager的find方法,可以获得相应的实体对象。每一个实体类至少要有一个主键(Primary key)。

       一旦使用@Id 标记属性为主键,该实体属性的值可以指定,也可以根据一些特定的规则自动生成。这就涉及另一个标记@GeneratedValue 的使用。

       @GeneratedValue 标注有以两个属性:

       (1)strategy 属性表示生成主键的策略 ,有4种类型,分别定义在枚举型GenerationType中,其中有 GenerationType.TABLE GenerationType.SEQUENCE GenerationType.IDENTITY GenerationType.AUTO ,其中,默认为AUTO,表示自动生成。

       (2)generator 为不同策略类型所对应的生成规则名,它的值根据不同的策略有不同的设置。

       (3)能够标识为主键的属性类型,有如表5-2所列举的几种。

分类 类型
Java的基本数据类型 byte、int、short、long、char
Java的基本数据类型对应的封装类 Byte、Integer、Short、Long、Character
大数值类型 java.math.BigInteger
字符串类型 java.lang.String
时间日期型 java.util.Date
java.sql.Date

 

 

 

 

 

 

 

 

 

 

 

 

 

       double和float浮点类型和它们对应的封装类不能作为主键,这是因为判断是否唯一是通过equals方法来判断的,浮点型的精度太大,不能够准确地匹配。

       例一,自增主键 。在不同的数据库,自增主键的生成策略可能有所不同。例如MySQL的自增主键可以通过IDENTITY来实现,而Oracle可能需要创建Sequence来实现自增。JPA的实现将会根据不同的数据库类型来实现自增的策略。

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	public Long getId() {
		return id;
	}

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

        例二,表生成器 。将当前主键的值单独保存到一个数据库的表中,主键的值每次都是从指定的表中查询来获得,这种生成主键的方式也是很常用的。这种方法生成主键的策略可以适用于任何的数据库,不必担心与同数据库不兼容造成问题。

         配置的Customer类

package model;

import java.io.Serializable;

import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.TableGenerator;

@Entity
@Table(schema = "open_jpa", name = "customer")
public class Customer implements Serializable
{
    private static final long serialVersionUID = -8480590552153589674L;

    private Integer           id;

    private String            name;

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "customer_gen")
    @TableGenerator(schema = "open_jpa", 
            name = "customer_gen", 
            table = "tbl_generator", 
            pkColumnName = "gen_name", 
            pkColumnValue = "CUSTOMER_PK", 
            valueColumnName = "gen_value", 
            allocationSize = 1, 
            initialValue = 0)
    public Integer getId()
    {
        return id;
    }

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

    @Basic
    @Column(name = "name")
    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }
}

 (1)在Entity标记的主键的位置,指定主键生成策略为“GenerationType.TABLE ”。

 (2)指定生成主键策略的名称,例如这里命名为“generator = "customer_gen" ”。

 (3)使用@TableGenerator标定义表生成策略的具体设置:

 @TableGenerator(schema = "open_jpa", 
            name = "customer_gen", 
            table = "tbl_generator", 
            pkColumnName = "gen_name", 
            pkColumnValue = "CUSTOMER_PK", 
            valueColumnName = "gen_value", 
            allocationSize = 1, 
            initialValue = 0)

 可以看到数据生成tbl_generator 的结构及添加的数据:

CREATE TABLE `tbl_generator` (
  `GEN_NAME` varchar(255) NOT NULL,
  `GEN_VALUE` bigint(20) default NULL,
  PRIMARY KEY  (`GEN_NAME`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO tbl_generator VALUES ('CUSTOMER_PK', 1);

 

使用Oracle的sequence方式生成ID值。  

 

    @Id  
    @GeneratedValue(strategy = GenerationType.SEQUENCE,generator="payablemoney_seq")  
    @SequenceGenerator(name="payablemoney_seq", sequenceName="seq_payment")  

 

@SequenceGenerator定义

@Target({TYPE, METHOD, FIELD})   
@Retention(RUNTIME)  
public @interface SequenceGenerator {  
 String name();  
 String sequenceName() default "";  
 int initialValue() default 0;  
 int allocationSize() default 50;  
} 

 name属性表示该表主键生成策略的名称,它被引用在@GeneratedValue中设置的“generator”值中。
sequenceName属性表示生成策略用到的数据库序列名称。
initialValue表示主键初识值,默认为0。
allocationSize表示每次主键值增加的大小,例如设置成1,则表示每次创建新记录后自动加1,默认为50。

 

 

 

 

 

 

 

 

 

 

  • JPA.rar (5.2 MB)
  • 下载次数: 129
分享到:
评论

相关推荐

    JPA注解总结大全!!!!

    ### JPA注解总结大全 Java Persistence API (JPA) 是一种用于管理关系数据库中的对象/关系映射的标准。本文将详细介绍与 JPA 相关的一些常用注解及其使用方法,帮助开发者更好地理解和掌握 JPA 的核心功能。 #### ...

    JPA注解实现联合主键

    ### JPA注解实现联合主键 在关系型数据库中,单个字段作为主键的情况较为常见,但在某些场景下,我们需要使用多个字段共同作为主键来唯一标识表中的每一条记录,这就是所谓的“联合主键”。而在Java持久化框架...

    JPA注解参考文档

    JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。 JPA支持XML和JDK5.0注解两种元数据的形式。 JPA的总体思想和现有Hibernate、TopLink、...

    JPA 注解参考文档

    JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。 JPA支持XML和JDK5.0注解两种元数据的形式。 JPA的总体思想和现有Hibernate、TopLink、...

    java程序使用JPA注解详解.doc

    Java 程序使用 JPA 注解详解 Java 持久层 API(Java Persistence API)是一种 Java 应用程序接口,用于访问、管理和持久化数据之间的关系。JPA 使用注解来定义实体类与数据库表之间的映射关系,本文将详细介绍 JPA ...

    jpa注解详解

    JPA注解详解 JPA(Java Persistence API)是Java企业版5(Java EE 5)的一部分,提供了一个对象关系映射方法,使得开发者可以使用声明方式定义如何将Java对象映射到关系数据库表。在JPA中,批注是一种使用元数据...

    JPA注解参考文档.txt

    ### JPA注解参考知识点详解 #### 一、引言 Java Persistence API(简称JPA)作为Java企业版5(Java EE 5)标准的一部分,是Enterprise JavaBeans(EJB)3.0规范的重要组成部分。它极大地简化了EJB持久化,并提供了...

    SpringMVC+JPA 注解开发 maven

    `@Entity`注解标识一个类为数据库中的表,`@Table`定义具体表名,`@Id`定义主键,`@GeneratedValue`处理主键生成策略。对于字段,`@Column`定义列属性,`@OneToMany`、`@ManyToOne`、`@OneToOne`和`@ManyToMany`处理...

    JPA注解 和hibernate 建表

    JPA注解和Hibernate建表 一、JPA概述 Java Persistence API(JPA)是Sun官方提出的Java持久化规范,它只是一个规范不是一个产品。JPA的主要目标是提供一种简洁、易用的方式来访问、操作和管理Java应用程序中的数据...

    spring注解+spring data jpa文档+JPA文档.rar

    Spring注解是Spring框架中的一大特色,它极大地简化了配置过程,让代码更加简洁易读。注解如`@Component`、`@Service`、`@Repository`和`@Controller`用于标记不同层次的Bean,而`@Autowired`则负责自动装配Bean之间...

    Hibernate之JPA注解

    Hibernate之JPA注解

    Toplink_JPA注解参考

    **Toplink JPA注解参考** Toplink JPA(Java Persistence API)是Oracle公司提供的一种对象关系映射(ORM)框架,它允许开发者使用Java对象来操作数据库,而无需直接编写SQL语句。JPA提供了丰富的注解,使得在Java...

    Hibernate使用JPA注解代码

    这个异常通常意味着在使用JPA注解配置时,遇到了不兼容或错误的配置。 首先,让我们深入理解`@Table`和`@Index`这两个JPA注解。`@Table`用于指定一个实体类所对应的数据库表名,而`@Index`则是用来定义表中的索引。...

    JPA注解@Access实例

    **JPA注解@Access详解** Java Persistence API (JPA) 是Java中用于对象关系映射(ORM)的标准框架,它允许开发人员将Java类与数据库表进行映射,从而简化数据操作。在JPA中,`@Access`注解是用于指定实体属性访问...

    jpa注解doc文档

    Jpa注解的各种jpa注释详解

    java程序使用JPA注解详解

    Java 程序使用 JPA 注解详解 Java 程序使用 JPA 注解可以实现对象关系映射(ORM),使得 ...JPA 注解提供了一种简单且灵活的方式来定义实体类与数据库表之间的映射关系,使得 Java 应用程序能够与关系数据库进行交互。

    spring3.0 mvc+hibernate3.6 +jpa 注解实例

    在本实例中,我们探讨的是一个基于Spring 3.0、Hibernate 3.6和Java Persistence API (JPA) 的集成应用,其中充分利用了注解来简化开发过程。这是一个适用于初学者和经验丰富的开发者深入了解这些技术如何协同工作的...

    JPA注解.doc J PA注解.

    以下是对JPA注解的详细解释: 1. **@Entity(name="EntityName")** 这个注解标记一个Java类为实体类,表示它将映射到数据库的一个表。`name`参数是可选的,用于指定表的名称。如果未指定,将使用类名作为表名。 2...

    JPA注解说明 详解

    Java Persistence API (JPA) 是Java平台上的一个标准,用于管理关系数据库中的对象持久化。JPA通过使用注解或XML来定义对象-关系映射(ORM),简化了数据库操作。下面将详细介绍JPA中的一些核心注解及其用法。 1. *...

Global site tag (gtag.js) - Google Analytics