JPA 注解_hibernate-cfg创建表
JPA实体注解与Hibernate主键生成策略(13种)

∙∙∙∙关注此空间 964zyz2012-01-13 09:31JPA实体注解与hibernate主键生成策略用hibernate注解开发项目,对于主键的生成策略有些模糊,下面是从新浪网里面看到的一篇关于hibernate注解以及主键生成策略的文章,值得一看:1. 实体标志:@Entity@Indexed(index="group")@Table(name="GROUP_LAYMOD")* @Indexed 标识需要进行索引的对象,* 属性 : index 指定索引文件的路径 @DocumentId 用于标示实体类中的唯一的属性保存在索引文件中,是当进行全文检索时可以这个唯一的属性来区分索引中其他实体对象,一般使用实体类中的主键属性* @Field 标注在类的get属性上,标识一个索引的Field属性 : index 指定是否索引,与Lucene相同store 指定是否索引,与Lucene相同name 指定Field的name,默认为类属性的名称analyzer 指定分析器在hibernate注解主键的时候,一般会使用到这两个。
@GeneratedValue的作用是JPA的默认实现自定义主键生成策略@GenericGenerator是hibernate在JPA的基础上增强。
自定义主键生成策略,由@GenericGenerator实现。
hibernate在JPA的基础上进行了扩展,可以用一下方式引入hibernate独有的主键生成策略,就是通过@GenericGenerator加入的。
比如说,JPA标准用法@Id@GeneratedValue(GenerationType.AUTO)就可以用hibernate特有以下用法来实现@GeneratedValue(generator = "paymentableGenerator")@GenericGenerator(name = "paymentableGenerator", strategy = "assigned")@GenericGenerator的定义:@Target({PACKAGE, TYPE, METHOD, FIELD})@Retention(RUNTIME)public @interface GenericGenerator {String name();String strategy();Parameter[] parameters() default {};}name属性指定生成器名称。
Hibernate.cfg.xml常用配置总结

Hibernate.cfg.xml常用配置总结测试时候Hibernate有如下常用甚至更多的配置,总结如下:(1)Hibernate.show_sql:是否在运行时候sql语句输出到控制台,编码阶段便于测试的。
(默认设置为true)(2)Hibernate.format_sql:输出在控制台sql语句是否进行排版,便于阅读。
(默认设置为true)(3)Hbm2ddl.auto:可帮助由java代码生成数据库脚本,进而生成具体表结构。
如:create/update/create-drop/validate。
Create:表示每次创建新的表格,原来的表删除,同时数据全部清楚重新插入数据。
(每次加载hibernate,重新创建数据库表结构,这就是导致数据库表数据丢失的原因。
)Update:表示在原有的表上更新,保存原来的数据。
(也就是原有数据不删除,依然存在,不需要重新插入,加载hibernate自动更新数据库结构)Create-drop:加载hibernate时创建,退出是删除表结构Validate:加载hibernate时,验证创建数据库表结构,如果是不同的话则不创建表。
(4)Hibernate.default_schema:默认数据库,如果设置了,则创建表的时候,所有表有前缀。
(5)Hibernate.dialect:配置hibernate方言,可针对特定的数据库优化。
(6)1.请慎重使用此参数,没必要就不要随便用。
2.如果发现数据库表丢失,请检查hibernate.hbm2ddl.auto的配置3.以上4个属性对同一配置文件下所用有的映射表都起作用例子如下:(一)Hibernate.format_sql:输出在控制台sql语句是否进行排版,便于阅读。
(默认设置为true)(二)Hbm2ddl.auto:可帮助由java代码生成数据库脚本,进而生成具体表结构的:create:先删除,再次创建表,再插入信息。
Intellij IDEA 如何通过数据库表生成带注解的实体类(图文详细教程)

Intellij IDEA 如何通过数据库表生成带注解的实体类(图文详细教程)这篇文章主要介绍了Intellij IDEA 如何通过数据库表生成带注解的实体类(图文详细教程),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧第一步:新建一个Maven项目。
项目的名称为JpaDemo。
我这里是通过idea插件对应的spring项目生成器https://start.spring.io,直接生成项目。
如图:下一步,修改成对应项目的基本信息。
如图:选择相应的依赖jar包。
选择项目的位置完成创建温馨提示,之前需要安装好maven。
选择Mysql。
配置数据库基本信息其实配置了这个数据库连接之后,是可以直接通过脚本进行导出数据库实体类了,但是这个导出的实体类比较简陋,需要进行修改比较多,或是需要自己进行修改生成脚本语句。
如:需要选一下实体类放置的地方。
效果如下:但是以上的实体类没有带注解。
那么我们通过项目中用到hibernate,或是jpa需要加注解怎么办,总不能一个个注解加上去吧。
idea当然不会这么干啦。
使用IntelliJ IDEA快编码速度:我们程序员的工作不是写程序,而是写程序解决问题。
那我们删了之前生成的实体类。
我们重新生成一份带注解的实体类。
第三步:配置hibernate文件。
如果没有配置该配置文件,idea则没有显示出生成实体类的工具选项。
配置一下hibernate配置文件。
在资源文件下新建一个hibernate.cfg.xml配置文件。
并输入以下内容。
如图:<?xml version='1.0' encoding='utf-8'?><!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""/dtd/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory><!-- Database connection settings --><property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost/test</property><property name="ername">root</property><property name="connection.password">123456</property><!-- JDBC connection pool (use the built-in) --><!--<property name="connection.pool_size">1</property>--><!-- SQL dialect --><property name="dialect">org.hibernate.dialect.MySQLDialect</property><!-- Enable Hibernate's automatic session context management --><property name="current_session_context_class">thread</property><!-- Echo all executed SQL to stdout --><property name="show_sql">true</property><!-- Drop and re-create the database schema on startup --><!--<property name="hbm2ddl.auto">update</property>--></session-factory></hibernate-configuration>调出生成实体类的配置工具me。
Hibernate+JPA注解教程

Hibernate+JPA注解教程一、开发环境●MyEclipse 8.5。
因为JPA只能应用在Hibernate3.2及以上的版本,而MyEclipse 8.5的核心库是Hibernate3.2的版本,在通过MyEclipse生成Hibernate的配置文件的时候会看到。
●Jdk 5.0。
●Tomcat5.5.28。
●Sql server 2000。
●Jar包:ejb3-persistence.jarhibernate3.jarhibernate-annotations.jarhibernate-entitymanager.jarhibernate-validator.jarjtds.jarjunit.jardom4j-1.6.1.jarhibernate-commons-annotations.jarcommons-collections.jarcglib-2.1.3.jarjta.jarantlr-2.7.6.jarasm.jarcommons-logging-1.0.4.jar二、开发实例1.首先创建一个Web工程,New->Web Project2.将开发需要用到的十五个jar包放到项目的WebRoot->WEB-INF->lib下面,并引用进来。
3.接下来需要配置一个DB Browser,Window->Show View->other会出现如下画面点OK之后会出现DB Browser的页面,在DB Browser页面的空白处点击右键,点击New之后,出现一个配置画面,配置如下(以sql server为例):然后点下一步,然后finish,中间不需要任何操作。
在DB Browser页面上右键点击刚才配置的jpaDb项目,选择open connection,成功之后会出现数据库的一个连接,里面可以看到数据库的所有表,效果如下:这样一个DB连接就配置完成了。
JPA & Hibernate 注解

JPA&Hibernate注解1、@Entity(name="EntityName")必须,name为可选,对应数据库中一的个表2、@Table(name="",catalog="",schema="")可选,通常和@Entity配合使用,只能标注在实体的class定义处,表示实体对应的数据库表的信息name:可选,表示表的名称.默认地,表名和实体名称一致,只有在不一致的情况下才需要指定表名catalog:可选,表示Catalog名称,默认为Catalog("").schema:可选,表示Schema名称,默认为Schema("").3、@id必须@id定义了映射到数据库表的主键的属性,一个实体只能有一个属性被映射为主键.置于getXxxx()前.4、@GeneratedValue(strategy=GenerationType,generator="")可选strategy:表示主键生成策略,有AUTO,INDENTITY,SEQUENCE和TABLE4种,分别表示让ORM框架自动选择,根据数据库的Identity字段生成,根据数据库表的Sequence字段生成,以有根据一个额外的表生成主键,默认为AUTOgenerator:表示主键生成器的名称,这个属性通常和ORM框架相关,例如,Hibernate可以指定uuid等主键生成方式.示例:@Id@GeneratedValues(strategy=StrategyType.SEQUENCE)public int getPk(){return pk;}5、@Basic(fetch=FetchType,optional=true)可选@Basic表示一个简单的属性到数据库表的字段的映射,对于没有任何标注的getXxxx()方法,默认即为@Basicfetch:表示该属性的读取策略,有EAGER和LAZY两种,分别表示主支抓取和延迟加载,默认为EAGER.optional:表示该属性是否允许为null,默认为true示例:@Basic(optional=false)public String getAddress(){return address;}6、@Column可选@Column描述了数据库表中该字段的详细定义,这对于根据JPA注解生成数据库表结构的工具非常有作用.name:表示数据库表中该字段的名称,默认情形属性名称一致nullable:表示该字段是否允许为null,默认为trueunique:表示该字段是否是唯一标识,默认为falselength:表示该字段的大小,仅对String类型的字段有效insertable:表示在ORM框架执行插入操作时,该字段是否应出现INSETRT语句中,默认为trueupdateable:表示在ORM框架执行更新操作时,该字段是否应该出现在UPDATE语句中,默认为true.对于一经创建就不可以更改的字段,该属性非常有用,如对于birthday字段. columnDefinition:表示该字段在数据库中的实际类型.通常ORM框架可以根据属性类型自动判断数据库中字段的类型,但是对于Date类型仍无法确定数据库中字段类型究竟是DATE,TIME还是TIMESTAMP.此外,String的默认映射类型为VARCHAR,如果要将String 类型映射到特定数据库的BLOB或TEXT字段类型,该属性非常有用.示例:@Column(name="BIRTH",nullable="false",columnDefinition="DATE")public String getBithday(){return birthday;}7、@Transient可选@Transient表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性.如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则,ORM框架默认其注解为@Basic示例://根据birth计算出age属性@Transientpublic int getAge(){return getYear(new Date())-getYear(birth);}8、@ManyToOne(fetch=FetchType,cascade=CascadeType)可选@ManyToOne表示一个多对一的映射,该注解标注的属性通常是数据库表的外键optional:是否允许该字段为null,该属性应该根据数据库表的外键约束来确定,默认为true fetch:表示抓取策略,默认为FetchType.EAGERcascade:表示默认的级联操作策略,可以指定为ALL,PERSIST,MERGE,REFRESH和REMOVE中的若干组合,默认为无级联操作targetEntity:表示该属性关联的实体类型.该属性通常不必指定,ORM框架根据属性类型自动判断targetEntity.示例://订单Order和用户User是一个ManyToOne的关系//在Order类中定义@ManyToOne()@JoinColumn(name="USER")public User getUser(){return user;}9、@JoinColumn可选@JoinColumn和@Column类似,介量描述的不是一个简单字段,而一一个关联字段,例如.描述一个@ManyToOne的字段.name:该字段的名称.由于@JoinColumn描述的是一个关联字段,如ManyToOne,则默认的名称由其关联的实体决定.例如,实体Order有一个user属性来关联实体User,则Order的user属性为一个外键,其默认的名称为实体User的名称+下划线+实体User的主键名称示例:见@ManyToOne10、@OneToMany(fetch=FetchType,cascade=CascadeType)可选@OneToMany描述一个一对多的关联,该属性应该为集体类型,在数据库中并没有实际字段. fetch:表示抓取策略,默认为ZY,因为关联的多个对象通常不必从数据库预先读取到内存cascade:表示级联操作策略,对于OneToMany类型的关联非常重要,通常该实体更新或删除时,其关联的实体也应当被更新或删除例如:实体User和Order是OneToMany的关系,则实体User被删除时,其关联的实体Order 也应该被全部删除示例:@OneTyMany(cascade=ALL)public List getOrders(){return orders;}11、@OneToOne(fetch=FetchType,cascade=CascadeType)可选@OneToOne描述一个一对一的关联fetch:表示抓取策略,默认为ZYcascade:表示级联操作策略示例:@OneToOne(fetch=ZY)public Blog getBlog(){return blog;}12、@ManyToMany可选@ManyToMany描述一个多对多的关联.多对多关联上是两个一对多关联,但是在ManyToMany描述中,中间表是由ORM框架自动处理targetEntity:表示多对多关联的另一个实体类的全名,例如:package.Book.class mappedBy:表示多对多关联的另一个实体类的对应集合属性名称示例:User实体表示用户,Book实体表示书籍,为了描述用户收藏的书籍,可以在User和Book 之间建立ManyToMany关联@Entitypublic class User{private List books;@ManyToMany(targetEntity=package.Book.class)public List getBooks(){return books;}public void setBooks(List books){this.books=books;}}@Entitypublic class Book{private List users;@ManyToMany(targetEntity=ers.class,mappedBy="books")public List getUsers(){return users;}public void setUsers(List users){ers=users;}}两个实体间相互关联的属性必须标记为@ManyToMany,并相互指定targetEntity属性,需要注意的是,有且只有一个实体的@ManyToMany注解需要指定mappedBy属性,指向targetEntity的集合属性名称利用ORM工具自动生成的表除了User和Book表外,还自动生成了一个User_Book表,用于实现多对多关联13、@MappedSuperclass可选@MappedSuperclass可以将超类的JPA注解传递给子类,使子类能够继承超类的JPA注解@MappedSuperclasspublic class Employee(){....}@Entitypublic class Engineer extends Employee{.....}@Entitypublic class Manager extends Employee{.....}14、@Embedded可选@Embedded将几个字段组合成一个类,并作为整个Entity的一个属性.例如User包括id,name,city,street,zip属性.我们希望city,street,zip属性映射为Address对象.这样,User对象将具有id,name和address 这三个属性.Address对象必须定义为@Embededable示例:@Embeddablepublic class Address{city,street,zip}@Entitypublic class User{@Embeddedpublic Address getAddress(){..........}}Hibernate验证注解注解适用类型说明示例@PatternString通过正则表达式来验证字符串@attern(regex=”[a-z]{6}”)@LengthString验证字符串的长度@length(min=3,max=20)@EmailString验证一个Email地址是否有效@RangeLong验证一个整型是否在有效的范围内@Range(min=0,max=100)@MinLong验证一个整型必须不小于指定值@Min(value=10)@MaxLong验证一个整型必须不大于指定值@Max(value=20)@Size集合或数组集合或数组的大小是否在指定范围内@Size(min=1,max=255)以上每个注解都可能性有一个message属性,用于在验证失败后向用户返回的消息,还可以三个属性上使用多个注解<!--v:3.2-->。
Hibernate实现(注解方式)

Hibernate实现(注解方式)注解方式:注解的方式与xml很很多类似:首先是需要加入4个jar包:hibernate-commons-annotations.jar 、 hibernate-annotations.jarejb3-persistence.jar 、 hibernate-jpa-2.0-api-1.0.1.Final.jar下面是不同的地方:(1):hibernate.hbm.xml 文件中把引用:xxx.hbm.xml改为引用实体类:即把:<mapping resource="com/wsw/hibernate/model/Person.hbm.xml"/>改为:<mapping class="com.wsw.hibernate.model.Teacher" />(2):获取SessionFactory方式发生了变化:即:由SessionFactory sf = new Configuration().configure().buildSessionFactory()改为:SessionFactory sf = new AnnotationConfiguration().configure().buildSessionFactory()(3):注解方式不需要在xxx.hbm.xml把实体类与表进行映射。
而采用在实体类中进行注解。
注意:(1):如果实体类属性名与表字段名不一致的时候,要么都注解在属性前,要么都注解在get方法前。
不能部分注解在属性前,部分注解在方法前。
(2):如果实体类属性名与表字段名一致的时候,可以部分注解在属性前,部分注解在方法前。
(3):如果在实体类中某些属性不注解:(属性和get都不写注解),默认为表字段名与实体类属性名一致。
(4):如果实体类的某个成员属性不需要存入数据库中,使用@Transient 进行注解就可以了。
jpa自动建表原理
jpa自动建表原理JPA自动建表原理1. 简介JPA(Java Persistence API)是Java EE标准中用于对象关系映射(ORM)和数据库访问的API。
它提供了一种简单的方式让开发者能够通过操作Java类和对象来访问和管理数据库。
在使用JPA时,我们通常只需要定义实体类,并通过注解来描述实体类与数据库表之间的映射关系。
JPA会根据这些注解信息自动创建或更新数据库表结构。
本文将深入探讨JPA自动建表的原理。
2. 数据库表结构生成过程配置文件在使用JPA之前,我们需要提供一个配置文件,其中包含数据库的连接信息和JPA的相关配置。
这通常是一个名为`的文件,存放在项目的META-INF`目录下。
实体类在创建实体类时,我们需要使用JPA的注解来描述实体类的属性和与数据库表之间的映射关系。
常用的注解有@Entity、@Table、@Column等。
@Entity注解用于声明一个类为JPA实体类,这样JPA才能识别该类,对其进行数据库操作。
@Table注解用于指定实体类与数据库表之间的映射关系。
@Column注解用于指定实体类中属性与表中字段之间的映射关系。
数据库表结构生成策略JPA提供了四种数据库表结构生成策略:•create:每次启动应用程序时,JPA都会重新创建数据库表结构,会导致数据丢失。
•create-drop:每次启动应用程序时,JPA都会创建数据库表结构,并在应用程序关闭时删除表结构。
•update:JPA会根据实体类的变化,更新数据库表结构。
对于已存在的表,JPA会根据变化自动进行修改,但不会删除或重建表。
•validate:JPA会校验实体类与数据库表之间的映射关系,并报告不匹配的错误。
但不会对表结构进行任何修改。
一般来说,我们会将生成策略设置为update,这样可以避免数据丢失,并保持数据库表与实体类的同步。
执行过程当我们的应用程序启动时,JPA会自动执行数据库表结构生成的相关逻辑。
jpa_注解_手册
核心提示:JPA 注解的几个要点1.设置Pojo为实体@Entity //标识这个pojo是一个jpa实体public class Users implements Serializable{ }2.设置表名@Entity @Table (name= users ) //指定表名为users public class Users implements Serializable{ }3.设置主键publicJPA 注解的几个要点1.设置Pojo为实体@Entity //标识这个pojo是一个jpa实体public class Users implements Serializable {}2.设置表名@Entity@Table(name = "users") //指定表名为userspublic class Users implements Serializable {}3.设置主键public class Users implements Serializable {@Idprivate String userCode;4. 设置字段类型通过@Column注解设置,包含的设置如下.name:字段名.unique:是否唯一.nullable:是否可以为空.inserttable:是否可以插入.updateable:是否可以更新.columnDefinition: 定义建表时创建此列的DDL.secondaryTable: 从表名。
如果此列不建在主表上(默认建在主表),该属性定义该列所在从表的名字。
@Column(name = "user_code", nullable = false, length=32)//设置属性userCode对应的字段为user_code,长度为32,非空private String userCode;@Column(name = "user_wages", nullable = true, precision=12, scale=2)//设置属性wages 对应的字段为user_wages,12位数字可保留两位小数,可以为空private double wages;@Temporal(T emporalType.DATE)//设置为时间类型private Date joinDate;5.字段排序在加载数据的时候可以为其指定顺序,使用@OrderBy注解实现@Table(name = "USERS")public class User {@OrderBy(name = "group_name ASC, name DESC")private List books = new ArrayList();}6.主键生成策略public class Users implements Serializable {@Id@GeneratedValue(strategy=GenerationType.IDENTITY)//主键自增,注意,这种方式依赖于具体的数据库,如果数据库不支持自增主键,那么这个类型是没法用的@Column(name = "user_id", nullable = false)private int userId;public class Users implements Serializable {@Id@GeneratedValue(strategy=GenerationType.TABLE)//通过一个表来实现主键id的自增,这种方式不依赖于具体的数据库,可以解决数据迁移的问题@Column(name = "user_code", nullable = false)private String userCode;public class Users implements Serializable {@Id@GeneratedValue(strategy=GenerationType.SEQUENCE)//通过Sequence来实现表主键自增,这种方式依赖于数据库是否有SEQUENCE,如果没有就不能用@SequenceGenerator(name="seq_user")@Column(name = "user_id", nullable = false)private int userId;7.一对多映射关系有T_One和T_Many两个表,他们是一对多的关系,注解范例如下主Pojo@Entity@Table(name = "T_ONE")public class One implements Serializable {private static final long serialVersionUID = 1L;@Id@Column(name = "ONE_ID", nullable = false)private String oneId;@Column(name = "DESCRIPTION")private String description;@OneToMany(cascade = CascadeType.ALL, mappedBy = "oneId")//指向多的那方的pojo 的关联外键字段private Collection<Many> manyCollection;子Pojo@Entity@Table(name = "T_MANY")public class Many implements Serializable {private static final long serialVersionUID = 1L;@Id@Column(name = "MANY_ID", nullable = false)private String manyId;@Column(name = "DESCRIPTION")private String description;@JoinColumn(name = "ONE_ID", referencedColumnName = "ONE_ID")//设置对应数据表的列名和引用的数据表的列名@ManyToOne//设置在“一方”pojo的外键字段上private One oneId;8.多对多映射关系貌似多对多关系不需要设置级联,以前用hibernate的时候着实为多对多的级联头疼了一阵子,JPA的多对多还需要实际的尝试一下才能有所体会。
Hibernate自动创建表bug问题解决
Hibernate⾃动创建表bug问题解决我在hibernate.cfg.xml配置⽂件中添加了⾃动创建表的的属性:(这样当数据库中没有此表是,hibernate就会⾃动帮我们创建⼀张表)<property name="hbm2ddl.auto">create</property>但是当执⾏的时候出现报错:INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQLDialectHibernate: drop table if exists student⼗⽉ 08, 2018 3:42:47 下午 org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnectionINFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@7882c44a] for (non-JTA) DDL execution was not in auto-comm Hibernate: create table student (id integer not null, name varchar(255), age integer, primary key (id)) type=MyISAM⼗⽉ 08, 2018 3:42:47 下午 org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnectionINFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@4bf324f9] for (non-JTA) DDL execution was not in auto-comm ⼗⽉ 08, 2018 3:42:47 下午 org.hibernate.tool.schema.internal.ExceptionHandlerLoggedImpl handleExceptionWARN: GenerationTarget encountered exception accepting command : Error executing DDL "create table student (id integer not null, name varchar(255), age integer, primary key (id)) type=MyISAM" via JDBC StatementmandAcceptanceException: Error executing DDL "create table student (id integer not null, name varchar(255), age integer, primary key (id)) type=MyISAM" via JDBC Statementat org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:67)at org.hibernate.tool.schema.internal.SchemaCreatorImpl.applySqlString(SchemaCreatorImpl.java:440)at org.hibernate.tool.schema.internal.SchemaCreatorImpl.applySqlStrings(SchemaCreatorImpl.java:424)at org.hibernate.tool.schema.internal.SchemaCreatorImpl.createFromMetadata(SchemaCreatorImpl.java:315)at org.hibernate.tool.schema.internal.SchemaCreatorImpl.performCreation(SchemaCreatorImpl.java:166)at org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:135)at org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:121)at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:155)at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:72)at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:310)at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:467)at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:708)at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:724)at hibernateTest.Test1.main(Test1.java:18)Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'type=MyISAM' at line 1at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)at ng.reflect.Constructor.newInstance(Unknown Source)at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)at com.mysql.jdbc.Util.getInstance(Util.java:408)at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:943)at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3973)at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909)at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527)at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680)at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2483)at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2441)at com.mysql.jdbc.StatementImpl.executeInternal(StatementImpl.java:845)at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:745)at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:54)... 13 more⼗⽉ 08, 2018 3:42:47 下午 org.hibernate.tool.schema.internal.SchemaCreatorImpl applyImportSourcesINFO: HHH000476: Executing import script 'org.hibernate.tool.schema.internal.exec.ScriptSourceInputNonExistentImpl@3c443976'Hibernate: insert into student (name, age, id) values (?, ?, ?)⼗⽉ 08, 2018 3:42:47 下午 org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptionsWARN: SQL Error: 1146, SQLState: 42S02⼗⽉ 08, 2018 3:42:47 下午 org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptionsERROR: Table 'student.student' doesn't exist⼗⽉ 08, 2018 3:42:47 下午 org.hibernate.internal.ExceptionMapperStandardImpl mapManagedFlushFailureERROR: HHH000346: Error during managed flush [org.hibernate.exception.SQLGrammarException: could not execute statement]Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not execute statementat org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154)at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181)at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:188)at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1460)at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:511)at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3283)at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2479)at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:473)at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:178)at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$300(JdbcResourceLocalTransactionCoordinatorImpl.java:39)at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$mit(JdbcResourceLocalTransactionCoordinatorImpl.java:271)at mit(TransactionImpl.java:98)at hibernateTest.Test1.main(Test1.java:24)Caused by: org.hibernate.exception.SQLGrammarException: could not execute statementat org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:63)at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113)at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:99)at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:178)at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3171)at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3686)at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:90)at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:604)at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:478)at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:356)at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39)at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1454)... 9 moreCaused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'student.student' doesn't existat sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)at ng.reflect.Constructor.newInstance(Unknown Source)at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)at com.mysql.jdbc.Util.getInstance(Util.java:408)at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:943)at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3973)at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909)at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527)at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680)at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2487)at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858)at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2079)at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2013)at com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5104)at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1998)at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:175)... 17 more通过查找问题发现,其实是⽀持mysql的版本问题:把:<property name="dialect">org.hibernate.dialect.MySQLDialect</property>改为:就可以了<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>。
Hibernate注解(一):基本注解
Hibernate注解(⼀):基本注解在Hibernate中使⽤注解,主要是为了替代映射⽂件,完成“类到表,属性到字段”的映射。
JPA提供了⼀套功能强⼤的注解。
Hibernate直接使⽤了JPA的这套注解。
当然,对于JPA中的⼀些不⾜,Hibernate⼜开发了⼀些⾃⼰的注解。
这些注解要么继承⾃JPA,要么是独⽴的注解,作为JPA的补充。
故,我们使⽤的注解,基本是javax.persistence.Transient包中的。
使⽤注解时需注意以下⼏点:(1)使⽤的均为javax.persistence.Transient包中的注解(2)不再需要映射⽂件了(3)在Hibernate主配置⽂件中⽆需指定映射⽂件了,但需要指定注解的实体类。
(springboot这⼀步也省了)注解的具体⽂档在javax.persistence包下的注解类型总结Annotation Type Summry中。
1、Hibernate基本注解根据其标注的位置与完成的功能,Hibernate注解可分为两种:类级注解、属性级注解。
. 类级注解:注解在类的头部。
完成类到表的映射。
. 属性级注解:注解在属性上⾯,或属性的get⽅法上⾯。
完成属性到字段的映射。
第⼀类:类级注解(1)@Entity⽤在POJO类上,表⽰当前类为实体类。
name属性为实体名称。
默认为类的⾮限定性类名。
⼀般使⽤默认值。
(2)@Table与@Entity联合使⽤。
name属性指定映射的表名。
默认与实体名称相同。
@Entity@Table(name="city")public class City {}第⼆类:属性级注解属性级注解根据其注解属性的不同,⼜可分为两类:主键相关注解,与普通属性注解。
主键相关注解(1)@Id⽤在主键id属性上,或其get⽅法上,表⽰当前属性将对应数据库中的主键。
(2)@GeneratedValue指定主键值的来源。
其属性strategy⽤于指定主键的⽣成策略。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
JPA(Java Persistence API)是Sun官方提出的java持久化规范,它只是一个规范不是一个产品,Hibernate已经是一个产品了。
使用Hibernate我们的劣势就是和这个框架结合的太机密了。
数据库开发的过程有两种过程的:1.先建表:根据数据库表编写配置文件的实体bean。
2.先编写文件和实体bean。
然后在生成表。
一、个人编写简单生成数据库表创建web project,名称JPAProjectjar包:src目录下创建META-INF文件夹存放持久化文件:persistence.xmlJPA 规范要求,配置文件必须命名为persistence.xml,并存在于类路径下的META-INF 目录中。
该文件通常包含了初始化JPA 引擎所需的全部信息。
<?xml version="1.0"?><persistence xmlns="/xml/ns/persistence"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/persistence/xml/ns/persistence/persistence_1_0.xsd" version="1.0"><persistence-unit name="yx"transaction-type="RESOURCE_LOCAL"><!-- 事物的类型,这里的实物类型是本地实物类型 --><provider>org.hibernate.ejb.HibernatePersistence</provider><properties><property name="hibernate.dialect"value="org.hibernate.dialect.MySQL5Dialect"/><!--数据库方言--> <property name="hibernate.connection.driver_class"value="com.mysql.jdbc.Driver"/><!--数据库驱动类--><property name="ername"value="root"/><!--数据库用户名--><property name="hibernate.connection.password"value="yx"/><!--密码--><property name="hibernate.connection.url"value="jdbc:mysql://localhost:3306/test"/><!--数据库连接URL--> <property name="hibernate.max_fetch_depth"value="3"/><!--外连接抓取树的最大深度 --><property name="hibernate.hbm2ddl.auto"value="update"/><!-- 自动输出schema创建DDL语句 --><property name="hibernate.jdbc.fetch_size"value="18"/><!-- JDBC 的获取量大小 --><property name="hibernate.jdbc.batch_size"value="10"/><!-- 开启Hibernate使用JDBC2的批量更新功能 --><property name="hibernate.show_sql"value="true"/><!-- 在控制台输出SQL语句 --></properties></persistence-unit><!--Oracle --><!--<persistence-unit name="default" transaction-type="RESOURCE_LOCAL"> <provider>oracle.toplink.essentials.PersistenceProvider</provider><exclude-unlisted-classes>false</exclude-unlisted-classes><properties><property name="toplink.logging.level" value="INFO"/><property name="toplink.jdbc.driver"value="oracle.jdbc.OracleDriver"/><property name="toplink.jdbc.url"value="jdbc:oracle:thin:@myhost:l521:MYSID"/><property name="toplink.jdbc.password" value="tiger"/><property name="er" value="scott"/></properties></persistence-unit>--></persistence>注:hibernate.hbm2ddl.autovalidate加载hibernate时,验证创建数据库表结构create 每次加载hibernate,重新创建数据库表结构,这就是导致数据库表数据丢失。
create-drop加载hibernate时创建,退出是删除表结构update加载hibernate自动更新数据库结构创建Person实体bean:package com.yx.zhujie;import java.io.Serializable;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;@Entity(name="tbl_people")public class Person implements Serializable{private static final long serialVersionUID = 1L;public Person(){}public Person(String name,String password){ = name;this.password = password;}private int id;private String name;private String password;//可以标志注解,其中标志注解有两种方法。
可以标注在get()方法上//还可以标注在属性上面//表示自动生成表的注解过程。
这里说明的生成主键的过程@Id@GeneratedValue(strategy = GenerationType.AUTO)//@Column(length=20,name="id")//如果要是生成括号里面的东西的话。
可以省略的,因为默认就是auto这个方法。
public int getId() {return id;}public void setId(int id) {this.id = id;}@Column(length=20,nullable=false,name="name")public String getName() {return name;}public void setName(String name) { = name;}@Column(length=20,nullable=false,name="password")public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}}事物过程包括(transaction-type="RESOURCE_LOCAL):本地事物和前提事物。
其中本地事物是指:用在同一个数据库中的;前提事物:是指用在不同数据库中的。
jpa中对表的各种属性进行设置:1.修改表的名字:@Table(name="people")2.在类的开始要写上:@Entity//进行注解表示3.时间类进行注解:@Temporal(TemporalType.DATE)//注解时间类的4.对主键进行注解:@Id@GeneratedValue(strategy = GenerationType.AUTO)5.对字段各种属性进行注解的过程:@Column(length=20,nullable=false,name="username")6.对枚举进行注解:@Enumerated(EnumType.STRING)@Column(length=5,nullable=false) //对枚举进行注解如果不想使用那个属性成为表的字段@Transient注解大文本的过程:@Lob这个Lob同样可以处理二进制的字段形式的东西@Lobpublic byte[] getFile(){return file;}设置延迟加载:@Basic(fetch=ZY)//设置延迟加载public void setFile(byte[] file){this.file = file;}@Lobpublic String getInfo(){return info;}public void setInfo(String info){ = info;}创建生成数据库表的测试类package com.yx.zhujie;import javax.persistence.EntityManager;import javax.persistence.EntityManagerFactory;import javax.persistence.Persistence;import org.junit.BeforeClass;import org.junit.Test;public class PersonTest {@BeforeClasspublic static void setUpBeforeClass()throws Exception{}//@Testpublic void createTable(){//createEntityManagerFactory(String persistenceUnitName, Map properties)//方法中properties的参数将覆盖persistence.xml文件配置的参数。