oracle和mysql 用jpa注解都有哪些区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle和mysql 用jpa注解都有哪些区别相关的知识,希望对你有一定的参考价值。

参考技术A   1、 @Entity(name="EntityName")
  表示该类是一个可持化的实体。当在容器中时,服务器将会首先加载所有标注了@Entity注释的实体类,其中@Entity中的“name”属性表示实体名称,若不作设置,默认为标注实体类的名称(注意大小写与系统的关系。)。 @Entity标注是必需的 ,name属性为可选。
  Java代码 收藏代码
  @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时要像下面这样:
  Sql代码 收藏代码
  SELECT p FROM person_1 AS p
  name属性为默认值时就使用类名称:
  Sql代码 收藏代码
  SELECT p FROM Person AS p;
  有两点须要注意:
  (1)实体可继承,非实体类可以继承自实体类,实体类也要中以继承自非实类。
  (2)抽象类(abstract)也可以标注为实体类。
  2、@Table
  在使用@Table标记时,需要注意以下几个问题。
  (1) 此标记需要标注在类名前,不能标注在方法或属性前。
  (2) name 属性表示实体所对应表的名称,默认表名为实体名称。
  (3) catalog 和schema 属性表示实体指定的目录名或数据库名,这个根据不同的数据类型有所不同。
  (4) uniqueConstraints 属性表示该实体所关联的唯一约束条件,一个实体可以有多个唯一的约束,默认没有约束条件。
  (5)若使用uniqueContraints 属性时,需要配合标记UniqueContraint标记来使用。
  Java代码 收藏代码
  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方法或属性前。
  如标注在属性前
  Java代码 收藏代码
  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方法前。
  Java代码 收藏代码
  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表示小数点所占的位数。
  示例一、
  Java代码 收藏代码
  private String name;
  @Column(name = "name",nullable=false,length=512)public String getName()
  return name;
  
  生成的SQL脚本为
  Java代码 收藏代码
  CREATE TABLE contact(
  id integer not null,
  name varchar(512) not null,
  primary key(id)
  );
  示例二、为double型指定精度为12位,小数点位数为2位。
  Java代码 收藏代码
  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脚本为
  Java代码 收藏代码
  CREATE TABLE contact(
  id integer not null,
  monthly_income double(12,2),
  primary key(id)
  );
  示例三、自定义生成CLOB类型字段的SQL语句
  Java代码 收藏代码
  @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脚本为
  Sql代码 收藏代码
  CREATE TABLE contact(
  id integer not null,
  contact_name <strong>clob(200) not null,</strong>
  primary key(id)
  );
  其中加粗的部份为columnDefinition属性设置的值。若不指定该属笥,通常使用默认的类型建表,若此时需要自定义建表的类型时,可以在该属性设置。
  可持久化的数据类型
  分类类型
  Java的基本数据类型byte、int、short、long、boolean、char、float、doubleJava的基本数据类型对应的封装类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类型。那么选择哪种类型比较合适呢?
  举下面的例子进行说明。
  Sql代码 收藏代码
  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 )。
  如:
  Java代码 收藏代码
  @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、charJava的基本数据类型对应的封装类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的实现将会根据不同的数据库类型来实现自增的策略。
  Java代码 收藏代码
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)public Long getId()
  return id;
  
  public void setId(Long id)
  this.id = id;
  
  例二,表生成器 。将当前主键的值单独保存到一个数据库的表中,主键的值每次都是从指定的表中查询来获得,这种生成主键的方式也是很常用的。这种方法生成主键的策略可以适用于任何的数据库,不必担心与同数据库不兼容造成问题。
  配置的Customer类
  Java代码 收藏代码
  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标定义表生成策略的具体设置:
  Java代码 收藏代码
  @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 的结构及添加的数据:
  Sql代码 收藏代码
  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值。
  Java代码 收藏代码
  @Id
  @GeneratedValue(strategy = GenerationType.SEQUENCE,generator="payablemoney_seq")@SequenceGenerator(name="payablemoney_seq", sequenceName="seq_payment")@SequenceGenerator定义
  Java代码 收藏代码
  @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。

SQL Server 和 Oracle 以及 MySQL 都有哪些区别

SQL Server 和 Oracle 以及 MySQL 之间的区别

MySql数据库 :

1.支持5000万条记录的数据仓库
2.适应于所有的平台
3.是开源软件,版本更新较快
4.性能很出色。纯粹就性能而言,MySQL是相当出色的,因为它包含一个缺省桌面格式MyISAM。MyISAM数据库 与磁盘非常地兼容而不占用过多的CPU和内存。MySQL可以运行于Windows 系统而不会发生冲突,在UNIX或类似UNIX系统上运行则更好。你还可以通过使用64位处理器来获取额外的一些性能。因为MySQL在内部里很多时候都使用64位的整数处理。
5.价格便宜
缺点: 缺乏一些存储程序的功能,比如MyISAM引擎联支持交换功能


MsSqlserver数据库: 

SQL Server 是 Microsoft推出一套产品,它具有使用方便、可伸缩性好、与相关软件集成程度高等优点,逐渐成为Windows平台下进行数据库应用开发较为理想的 选择之一。

1.真正的客户机/服务器体系结构
2.图形化的用户界面,使系统管理和数据库管理更加直观、简单
3.丰富的编程接口工具,为用户进行程序设计提供了更大的选择余地
4.与WinNT完全集成,利用了NT的许多功能,如发送和接受消息,管理登录安全性等,SQL Server也可以很好地与Microsoft BackOffice产品集成。
5.有很好的伸缩性,可以跨平台使用。
6.提供数据仓库功能,这个功能只在Oracle和其他 昂贵的DBMS中才有。


Oracle数据库:

oracle 能在所有主流平台上运行(包括 windows)。完全支持所有的工业标准。采用完全开放策略。可以使客户选择最适合的解决方案。

1.Oracle的稳定性要比Sql server好。
2.Oracle在导数据工具sqlload.exe功能比Sqlserver的Bcp功能强大,Oracle可以按照条件把文本文件数据导入.
3.Oracle的安全机制比Sql server好。
4.Sql server的易用性和友好性方面要比Oracle好。
5.在处理大数据方面Oracle会更稳定一些。
6.Sql Server在数据导出方面功能更强一些。
7.处理速度方面比Oracle快一些,和两者的协议有关.
缺点: 价格昂贵

参考技术A 首先一点,这三个数据库不是同一个公司的产品;
二、其所对应的使用对象也不一样,oracle是主流的大型数据库,大多数电信项目都是使用的oracle,而sqlserver与mysql主要是个人以及小型公司使用的的数据库,但是sqlserver需要收费,mysql不用;
三、如果按功能上来说,oracle最为强大,oracle支持递归查询,二后两者不支持;
四、三个数据库中,只有sqlserver有完整的图形化操作界面,而oracle与mysql都要借助于其他的第三方数据库图形操作界面,比如oracle用的大多都是plsql;

以上是关于oracle和mysql 用jpa注解都有哪些区别的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 和 Oracle 以及 MySQL 都有哪些区别

SQL Server 和 Oracle 以及 MySQL 都有哪些区别

oracle ,mysql 和sqlserver的主要区别都有哪些?

Jpa中的persist方法和merge方法都有哪些区别,帮我举一个例子解释下?

mybatis和ibatis的区别

JPA 和Hibernate annotation区别