JPA_Basic
JPA设置默认字段及其长度详解

JPA设置默认字段及其长度详解⽬录String定义 Integer 和 Long 有区别吗定义Integer和int有区别吗boolean类型⽇期浮点数格式的设置⼤⽂本使⽤jpa去⽣成对应的值的长度和默认值是如何设置的呢@Target({ElementType.METHOD, ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)public @interface Column {String name() default "";boolean unique() default false;boolean nullable() default true;boolean insertable() default true;boolean updatable() default true;String columnDefinition() default "";String table() default "";int length() default 255;int precision() default 0;int scale() default 0;}name 属性⽤来设置字段的名字unique⽤于设置这个字段是否是是唯⼀的insertable和updatable、table都是和表更新相关的操作,length 指定长度,默认是255precision 数据长度scale⼩数的长度columnDefinition 指定这⼀列的信息Stringstring是最常见的字段,@Column(name = “name”)private String name;SQL中 name varchar(255)⽣成的字段长度为255,即如果不设置长度的话默认的长度就是255个。
@Column(name = “name”,length = 50)private String name;name varchar(50)@Column(name = “name”,columnDefinition=“varchar(11) COMMENT ‘⽤户姓名'”)private String name;name varchar(11) COMMENT ‘⽤户姓名'这⾥不仅指定了长度,还给列了⼀个注释,便于查看@Column(name = “name”,columnDefinition=“default ‘12345'”)private String name;如果我们制定默认值,这样SQL语句就会报错create table user (id bigint not null, age integer, birth datetime(6), name default ‘12345', sex bit, primary key (id)) engine=InnoDB如果我们制定长度呢@Column(name = “name”,columnDefinition=“default ‘12345'”,length = 25)private String name;运⾏的DDL语句依然⽆法创建出表create table user (id bigint not null, age integer, birth datetime(6), name default ‘12345', sex bit, primary key (id)) engine=InnoDB如何给String字段指定默认值呢所以如果指定columnDefinition这个属性会覆盖原来的列注解的长度,⽽且在其注解的中必须制定列的类型/*** (Optional) The SQL fragment that is used when* generating the DDL for the column.* <p> Defaults to the generated SQL to create a* column of the inferred type.*/String columnDefinition() default "";/***(可选)在以下情况下使⽤的SQL⽚段:*正在为列⽣成DDL。
jpa baseentity 最佳实践

jpa baseentity 最佳实践在使用 JPA(Java Persistence API)进行数据持久化时,BaseEntity 是一个常见的实体类,通常用于封装实体类的一些共用属性和方法。
BaseEntity 包含了一些常见的属性,例如 id、createAt 和 updateAt,以及一些常见的方法,例如获取/设置这些属性的方法。
在本文中,我们将探讨 JPA BaseEntity 的最佳实践。
1. BaseEntity 类的设计设计 BaseEntity 类时需要考虑以下几个方面:1.1. 声明实体类的共用属性BaseEntity 类一般包含实体类的共用属性,最基本的属性是 id,用于标识实体的唯一性。
此外,常见的属性还包括 createAt(用于记录实体创建时间)和updateAt(用于记录实体更新时间)。
1.2. 提供默认的构造方法在 BaseEntity 类中,最好提供一个默认的无参构造方法。
这样可以在实例化子实体类时,通过调用父类的构造方法,自动初始化 BaseEntity 中的共用属性。
1.3. 考虑添加其他通用属性除了 id、createAt 和 updateAt 属性之外,根据需求,还可以考虑添加其他通用属性,例如逻辑删除标记、创建者和修改者等。
这些属性的添加应根据实际业务需求,避免过度设计。
2. 实现 BaseEntity 类实现 BaseEntity 类时,应注意以下几点:2.1. 定义属性和对应的访问方法在 BaseEntity 类中,应定义 id、createAt 和 updateAt 属性,并为它们提供相应的访问方法。
这些方法通常是公开的,供子类继承和使用。
2.2. 使用 JPA 注解若 BaseEntity 类需要被持久化存储,需要使用 JPA 注解指定表名、字段名和关联关系等元数据信息。
根据实际需求,可以使用 @Entity、@Table 和 @Column 等注解。
基于JPA中的@Basic注解详解

基于JPA中的@Basic注解详解今天我们来聊聊JPA @Basic注解的使⽤1.介绍:@Basic 是实体类与数据库字段映射时最简单的类型。
在该注解的介绍中:The <code>Basic</code> annotation can be applied to a persistent* property or instance variable of any of the following types: Java* primitive types, wrappers of the primitive types, <code>String</code>,* <code>java.math.BigInteger</code>,* <code>java.math.BigDecimal</code>,* <code>java.util.Date</code>,* <code>java.util.Calendar</code>,* <code>java.sql.Date</code>,* <code>java.sql.Time</code>,* <code>java.sql.Timestamp</code>, <code>byte[]</code>, <code>Byte[]</code>,* <code>char[]</code>, <code>Character[]</code>, enums, and any other type that* implements <code>java.io.Serializable</code>我们可以看到,它可以⽤于持久类属性或实例变量(instance variable)上,类型包含java基本类型(byte,short,int,long,float,double,char,boolean),包装类,枚举类,以及实现了Serializable接⼝的类型。
JPA 批注参考

JPA 批注参考(1)2008年05月29日星期四 10:28来源:■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■JPA批注是EJB 3标准的一部分,用于为ORM框架提供基于批注的配置方式,但是JPA本身是独立于EJB 3的,可被任何的ORM框架使用。
本文的主要内容如下:1、按照类别对JPA批注进行划分,划分为11个类别,各个类别及其可以使用的批注(括号内即为可以使用的批注)如下:⑴ 实体(@Entity)⑵ 数据库模式属性(@Table、@SecondaryTable、@SecondaryTables、@Column、@JoinColumn、@JoinColumns、@PrimaryKeyJoinColumn、@PrimaryKeyJoinColumns、@JoinTable、@UniqueConstraint)⑶ 身份(@Id、@IdClass、@EmbeddedId、@GeneratedValue、@SequenceGenerator、@TableGenerator)⑷ 直接映射( @Basic、@Enumerated、@Temporal、@Lob、@Transient)⑸ 关系映射(@OneToOne、@ManyToOne、@OneToMany、@ManyToMany、@MapKey、@OrderBy)⑹ 组合(@Embeddable、@Embedded、@AttributeOverride、@AttributeOverrides、@AssociationOverride、@AssociationOverrides)⑺ 继承(@Inheritance、@DiscriminatorColumn、@DiscriminatorValue、@MappedSuperclass、@AssociationOverride、@AssociationOverrides、@AttributeOverride、@AttributeOverrides)⑻ 锁定(@Version)⑼ 生命周期回调事件(@PrePersist、@PostPersist、@PreRemove、@PostRemove、@PreUpdate、@PostUpdate、@PostLoad、@EntityListeners、@ExcludeDefaultListeners、@ExcludeSuperclassListeners)⑽ 实体管理器(@PersistenceUnit、@PersistenceUnits、@PersistenceContext、@PersistenceContexts、@PersistenceProperty)⑾ 查询(@NamedQuery、@NamedQueries、@NamedNativeQuery、@NamedNativeQueries、@QueryHint、@ColumnResult、@EntityResult、@FieldResult、@SqlResultSetMapping、@SqlResultSetMappings)2、详细解释了下面4个批注的含义及其批注所包含的属性:@AssociationOverride@AssociationOverrides@AttributeOverride@AttributeOverrides注意:原文有错误的之处已经在这里全部更正。
jpa 用法

jpa 用法
JPA(Java Persistence API)是一种Java标准,用于将Java 对象与关系数据库进行映射。
下面是JPA的基本用法:
1.添加依赖:首先,需要在项目中添加JPA的依赖。
常见的做法是使用Maven或Gradle等构建工具,将相关的JAR 包添加到项目中。
2.配置数据源:在项目中配置数据源,包括数据库连接信息、用户名和密码等。
这通常在项目的配置文件中完成。
3.创建实体类:根据数据库表的结构,创建对应的Java 实体类。
每个实体类通常对应一个数据库表,实体类中的属性与表中的列一一对应。
4.配置实体管理器:使用实体管理器来管理实体类的生命周期,包括实体的创建、查询、更新和删除等操作。
5.查询数据:使用JPQL(Java Persistence Query Language)或SQL查询数据。
JPQL是一种类似于SQL的查询语言,专门用于查询实体类和关联数据。
6.处理结果:查询结果通常返回一个实体类的列表或单个实体对象。
可以根据需要对结果进行处理,例如将数据展示在前端页面上。
7.事务管理:在执行数据增删改查等操作时,需要进行事务管理。
JPA支持声明式事务管理,可以通过注解或XML
配置来指定事务的边界。
以上是JPA的基本用法,具体的实现方式可能因不同的框架和环境而有所差异。
SpringDataJPA在Entity中常用的注解浅析

SpringDataJPA在Entity中常⽤的注解浅析 ⾸先我们常⽤的注解包括(@Entity、@Table、@Id、@IdClass、@GeneratedValue、@Basic、@Transient、@Column、@Temporal、@Enumerated、@Lob)1. @Entity使⽤此注解定义的对象将会成为被JPA管理的实体,将映射到指定的数据库表@Entity(name = "user")其中name默认是此实体类的名字,全局唯⼀。
2. @Table指定此实体类对应的数据库的表名。
若注解不加名字则系统认为表名和实体类的名字相同3. @Id定义字段为数据库的主键,⼀个实体⾥⾯必须有⼀个。
4. @IdClass利⽤外部类的联合主键,其中外部类必须满⾜⼀下⼏点要求必须实现Serializable接⼝。
必须有默认的public⽆参数的构造⽅法。
必须覆盖equals和hashCode⽅法。
equals⽅法⽤于判断两个对象是否相同,EntityManger通过find⽅法来查找Entity时是根据equals的返回值来判断的。
hashCode⽅法返回当前对象的哈希码,⽣成的hashCode相同的概率越⼩越好,算法可以进⾏优化。
5. @GeneratedValue为主键⽣成策略默认为AUTO即JPA⾃动选择合适的策略IDENTITY 适⽤于MySQL,策略为⾃增SEQUENCE 通过序列⽣成主键通过@SquenceGenerator指定序列名MySQL不⽀持TABLE 框架由表模拟产⽣主键,使⽤该策略有利于数据库移植6. @Basic表⽰此字段是映射到数据库,如果实体字段上没有任何注解默认为@Basic。
其中可选参数为@Basic(fetch = ZY, optional = false)其中fetch默认为EAGER⽴即加载,LAZY为延迟加载、optional表⽰该字段是否可以为null7. @Transient和@Basic的作⽤相反,表⽰该字段不是⼀个到数据库表的字段映射,JPA映射数据库的时候忽略此字段。
jpa命名规则

jpa命名规则JavaPersistenceAPI(JPA)是JavaEE平台提供的数据库持久化技术。
它通过定义一套灵活、通用的持久性规范,可以让开发人员使用它来管理持久化数据。
在使用JPA进行数据持久化时,要遵守JPA 的命名规则,这些命名规则是持久化操作的基础。
首先,JPA的命名规则规定了数据库表和字段的命名格式。
在JPA 规范中,表的命名规则要求使用大写字母加下划线的格式,例如:USER_INFO,字段必须以小写字母开始,每个单词之间使用下划线分隔,例如:user_name。
其次,JPA还规定了实体类的命名规则。
在JPA中,实体类应该以一般的单词作为名称,使用驼峰命名规则,首字母应该大写,每个单词的首字母应该大写,例如:UserInfo。
还有,JPA规定实体类中的属性也要遵循特定的命名规则,属性的名称也应该使用驼峰命名法,属性的第一个字母应该小写,每个单词的首字母应该大写,例如:userName。
此外,JPA还是规定一些其它的字段命名规则,例如,主键字段应该以id或者ID开头,外键字段应该以外键名称开头,例如:userId;外键字段的类型应该定义为外键引用的实体类的类型,而不是其他类型;字段的命名应该有语义,而不是使用乱七八糟的字符。
最后,JPA还规定了实体类和其他类之间映射关系的命名规则。
在JPA中,实体类之间映射关系具有一定的规律性,通常情况下,一个实体类名称加一个`s`就可以得到它与另一个实体类之间映射关系的名称,例如:user_info表与user_role表之间的映射关系名称为usersRoles。
以上就是JPA的命名规则,遵循这些规则可以有效地管理数据库中的数据,从而使程序的代码更加简洁、清晰,而且易于维护和管理。
JPA常用注解

(1)Entity@javax.persistence.Entity(name="xxx")name指定实体Bean的名称,默认值为bean class 的非限定类名(不带包的短类名)(2)Table@javax.persistence.Table(catalog="xx",name="xx",schema="xx",uniqueConstraints={ @ UniqueConstraint(columnNames={"xx","xx"})})name:指定表的名称catalog:指定数据库名称schema:指定数据库的用户名uniqueConstraints:指定唯一性字段约束(字段值唯一不重复)如为personid和name 字段指定唯一性约束:uniqueConstraints={ @UniqueConstraint(columnNames={"personid", "name"})}(3)Id@javax.persistence.Id()映射到数据库表的主键的属性,一个实体只能有一个属性被映射为主键.(4)GeneratedValue@javax.persistence.GeneratedValue(generator="xxx",strategy=GenerationType.AUTO) strategy:表示主键生成策略,有方式一:@GeneratedValue(strategy=GenerationType.AUTO) 默认策略,生成方式取决于底层的数据库。
方式二:@GeneratedValue(strategy = GenerationType.IDENTITY)指定“自动增长”策略,适用于MySQL。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
JPA 教程1.JPA概述JPA(Java Persistence API)作为Java EE 5.0平台标准的ORM规范,将得到所有Java EE服务器的支持。
Sun这次吸取了之前EJB规范惨痛失败的经历,在充分吸收现有ORM框架的基础上,得到了一个易于使用、伸缩性强的ORM规范。
从目前的开发社区的反应上看,JPA受到了极大的支持和赞扬,JPA作为ORM领域标准化整合者的目标应该不难实现。
JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中,图 1很好地描述了JPA的结构:Sun引入新的JPA ORM规范出于两个原因:其一,简化现有Java EE和Java SE应用的对象持久化的开发工作;其二,Sun希望整合对ORM技术,实现天下归一。
JPA由EJB 3.0软件专家组开发,作为JSR-220实现的一部分。
但它不囿于EJB 3.0,你可以在Web应用、甚至桌面应用中使用。
JPA的宗旨是为POJO提供持久化标准规范,由此可见,经过这几年的实践探索,能够脱离容器独立运行,方便开发和测试的理念已经深入人心了。
目前Hibernate 3.2、TopLink 10.1.3以及OpenJpa都提供了JPA的实现。
JPA的总体思想和现有Hibernate、TopLink,JDO等ORM框架大体一致。
总的来说,JPA包括以下3方面的技术:ORM映射元数据,JPA支持XML和JDK 5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中;JPA 的API,用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。
查询语言,这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。
2.实体对象访问数据库前,我们总是要设计在应用层承载数据的领域对象(Domain Object),ORM框架将它们持久化到数据库表中。
为了方便后面的讲解,我们用论坛应用为例,建立以下的领域对象:Topic是论坛的主题,而PollTopic是调查性质的论坛主题,它扩展于Topic,一个调查主题拥有多个选项PollOption。
这三个领域对象很好地展现了领域对象之间继承和关联这两大核心的关系。
这3个领域对象将被映射到数据库的两张表中:其中,Topic及其子类PollTopic将映射到同一张t_topic表中,并用topic_type字段区分两者。
而PollOption映射到t_polloption中。
具有ORM元数据的领域对象称为实体(Entity),按JPA的规范,实体具备以下的条件:必须使用javax.persistence.Entity注解或者在XML映射文件中有对应的元素;必须具有一个不带参的构造函数,类不能声明为final,方法和需要持久化的属性也不能声明为final;如果游离状的实体对象需要以值的方式进行传递,如通Session bean的远程业务接口传递,则必须实现Serializable接口;需要持久化的属性,其访问修饰符不能是public,它们必须通过实体类方法进行访问。
3.使用注解元数据基本注解首先,我们对Topic领域对象进行注解,使其成为一个合格的实体类:代码清单1:Topic实体类的注解package com.baobaotao.domain;…import javax.persistence.Column;import javax.persistence.DiscriminatorColumn;import javax.persistence.DiscriminatorType;import javax.persistence.DiscriminatorValue;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.Inheritance;import javax.persistence.InheritanceType;import javax.persistence.Temporal;import javax.persistence.TemporalType;@Entity(name = "T_TOPIC") ①public class Topic implements Serializable ...{@Id ②-1@GeneratedValue(strategy = GenerationType.TABLE)②-2@Column(name = "TOPIC_ID") ②-3private int topicId;@Column(name = "TOPIC_TITLE", length = 100) ③private String topicTitle;@Column(name = "TOPIC_TIME")@Temporal(TemporalType.DATE) ④private Date topicTime;@Column(name = "TOPIC_VIEWS")private int topicViews;//省略get/setter方法}@Entity:将领域对象标注为一个实体,表示需要保存到数据库中,默认情况下类名即为表名,通过name属性显式指定表名,如①处的name = "T_TOPIC",表示Topic保存到T_TOPIC表中;@Id :对应的属性是表的主键,如②-1所示;@GeneratedValue:主键的产生策略,通过strategy属性指定。
默认情况下,JPA自动选择一个最适合底层数据库的主键生成策略,如SqlServer对应identity,MySql 对应auto increment。
在javax.persistence.GenerationType中定义了以下几种可供选择的策略:1) IDENTITY:表自增键字段,Oracle不支持这种方式;2) AUTO: JPA自动选择合适的策略,是默认选项;3) SEQUENCE:通过序列产生主键,通过@SequenceGenerator注解指定序列名,MySql不支持这种方式;4) TABLE:通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植。
不同的JPA实现商生成的表名是不同的,如 OpenJPA生成openjpa_sequence_table表Hibernate生成一个hibernate_sequences表,而TopLink则生成sequence表。
这些表都具有一个序列名和对应值两个字段,如SEQ_NAME和SEQ_COUNT。
@Column(name = "TOPIC_ID"):属性对应的表字段。
我们并不需要指定表字段的类型,因为JPA会根据反射从实体属性中获取类型;如果是字符串类型,我们可以指定字段长度,以便可以自动生成DDL语句,如③处所示;@Temporal(TemporalType.DATE):如果属性是时间类型,因为数据表对时间类型有更严格的划分,所以必须指定具体时间类型,如④所示。
在javax.persistence.TemporalType枚举中定义了3种时间类型:1) DATE :等于java.sql.Date2) TIME :等于java.sql.Time3) TIMESTAMP :等于java.sql.Timestamp继承关系Topic和PollTopic是父子类,JPA 采用多种方法来支持实体继承。
在父类中必须声明继承实体的映射策略,如代码清单2所示:代码清单2:继承实体的映射策略…@Entity(name = "T_TOPIC")@Inheritance(strategy =InheritanceType.SINGLE_TABLE) ①@DiscriminatorColumn(name = "TOPIC_TYPE",discriminatorType =DiscriminatorType.INTEGER, length = 1) ②@DiscriminatorValue(value="1")③public class Topic implements Serializable ...{…}对于继承的实体,在javax.persistence.InheritanceType定义了3种映射策略:SINGLE_TABLE:父子类都保存到同一个表中,通过字段值进行区分。
这是我们Topic实体所采用的策略, Topic和PollTopic都保存到同一张表中,通过TOPIC_TYPE字段进行区分,Topic在T_TOPIC表中对应TOPIC_TYPE= 1的记录,而PollTopic对应TOPIC_TYPE=2的记录(稍后在PollTopic实体中指定);区别的字段通过 @DiscriminatorColumn说明,如②所示,区分字段对应该实体的值通过@DiscriminatorValue指定,如③所示;JOINED:父子类相同的部分保存在同一个表中,不同的部分分开存放,通过表连接获取完整数据;TABLE_PER_CLASS:每一个类对应自己的表,一般不推荐采用这种方式。
关联关系我们再继续对PollTopic进行注解,进一步了解实体继承的JPA映射定义:代码清单3:PollTopic映射描述package com.baobaotao.domain;…@Entity@DiscriminatorValue(value="2") ①public class PollTopic extends Topic ...{②继承于Topic实体private boolean multiple; ③@Column(name = "MAX_CHOICES")private int maxChoices;@OneToMany(mappedBy="pollTopic",cascade=CascadeType.ALL)④private Set options = new HashSet();//省略get/setter方法}在①处,通过@DiscriminatorValue将区分字段TOPIC_TYPE的值为2。