02-hibernate注解-属性级别注解
添加方式:
一是写在属性字段上面。
二是写在属性的get访问器上面。
主要有:
@Id,
@SequenceGenerator
@GeneratedValue
@Colum
@Embedded
@EmbeddedId
@Lob
@Version
@Basic
@Transient
@Id
@Id:定义了映射到数据库主键属性,可以有一个或者多个属性被映射为主键,可以置于主键属性或者get方法前。
注意:如果定义了多个主键属性,该实体类必须实现serializable接口。
对于多个主键属性的例子,在实体类中继承接口:

@GeneratedValue
@GeneratedValue(strategy=GenerationType, generator="");
可选,用于定义主键生成策略。
strategy表示主键生成策略,取值有:
1,GenerationType.Auto:根据底层数据库自动选择(默认)。
2,GenerationType.INDENTITY:使用数据库的Identity字段生成。
3,GenerationtType.SEQUENCE:使用Sequence来决定主键的取值。
4,GenerationtType.TABLE:使用指定表来决定主键取值,结合@TableGenerator使用。
如:
@Id,
@TableGenerator(name="tab_cat_gen",allocationSize=1)
@GeneratedValue(Strategy=GenerationType.TABLE)
Generator-表示主键生成器名称,这个属性通常和ORM框架相关,
例如:hibernate可以指定uuid等主键生成方式。

发现执行过程中添加了自增,且大小为1.

@Column
@Column-可将属性映射到列,使用该注解来覆盖默认值,@Column描述了数据库中该字段的详细定义。
这对于根据JPA注解生成数据库结构的宫建非常有用。

@Embedded(注意不是@Embeddable)
@Embedded是注释属性的,表示该属性的类是嵌入类。
注意:同时嵌入类也必须标注@Embeddable。

同时嵌入类:

@EmbeddedId
通常使用嵌入式主键实现复合主键。
注意:嵌入式主键类必须实现Serializable接口,必须有默认的public 无参数的构造方法,必须重写覆盖equals和hashCode方法。
实例:
第一步:新建一个复合主键的嵌入类。
需要注意:1,加上Embeddable表示嵌入类,2,因为复合主键的两个属性是string类型,要控制大小,加上Column,
3,复写equals和hashcode方法。
package Com.Entity;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Embeddable; //学生主键类
@Embeddable
public class StudentsPK implements Serializable { private static final long serialVersionUID = 1L;//因为继承了序列化接口,这里生成一个版本号
@Column(length=18)
private String id;//身份证号码
@Column(length=8)
private String sid;//学号 public StudentsPK()
{ } @Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((sid == null) ? 0 : sid.hashCode());
return result;
} @Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
StudentsPK other = (StudentsPK) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (sid == null) {
if (other.sid != null)
return false;
} else if (!sid.equals(other.sid))
return false;
return true;
} public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} public String getSid() {
return sid;
} public void setSid(String sid) {
this.sid = sid;
} }
第二步:在实体类中加上这个复合主键类对象。
需要注意:1,对于普通的嵌入对象,加上@Embedded,2,对于复合主键对象,加上@EmbeddedId,并且还要加上@Id,
3,别忘了对与新加的属性,加上get/set方法。
package Com.Entity;
import java.io.Serializable;
import java.util.Date; import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;/*JPA主键*/
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table; /*学生实体类*/
@Entity
@Table(name="Students",schema="sys")
public class Students implements Serializable { private static final long serialVersionUID = 1L; @Id
@GeneratedValue(strategy=GenerationType.AUTO)
@EmbeddedId
private StudentsPK sid; private String sname;//姓名
private String gender;//性别
private Date birthday;
private String major;//专业
@Embedded
private Address address; public Students()
{ }
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
} public Students(StudentsPK sid, String sname, String gender, Date birthday, String major, Address address) {
//super();
this.sid = sid;
this.sname = sname;
this.gender = gender;
this.birthday = birthday;
this.major = major;
this.address=address;
}
public StudentsPK getSid() {
return sid;
} public void setSid(StudentsPK sid) {
this.sid = sid;
} public String getSname() {
return sname;
} public void setSname(String sname) {
this.sname = sname;
} public String getGender() {
return gender;
} public void setGender(String gender) {
this.gender = gender;
} public Date getBirthday() {
return birthday;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
} public String getMajor() {
return major;
} public void setMajor(String major) {
this.major = major;
}
}
第三步:加上测试类:
package Com.Entity;
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.junit.Test; public class AddStudents { @Test
public void testAddStudents()
{
//创建配置对象
Configuration config=new Configuration().configure();
//创建服务注册对象。
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build();
//创建会话工厂对象
SessionFactory sessionFactory=config.buildSessionFactory(serviceRegistry);
//创建会话对象
Session session=sessionFactory.openSession();
//开启事务
Transaction transaction=session.beginTransaction();
//创建一个学生对象
Address add=new Address("7932322","武当山","312321");
//创建一个学生主键对象
StudentsPK pk=new StudentsPK();
pk.setId("93328217421234834");
pk.setSid("94323423");
Students s=new Students(pk,"张三丰","男",new Date(),"太极拳",add); session.save(s);
transaction.commit(); }
}
第四步:验证:成功插入:

最开始报错了,如下写的:
@Test
public void testAddStudents()
{
//创建配置对象
Configuration config=new Configuration().configure();
config.addClass(Students.class);//这个需要加上(视频里面没有)
//创建服务注册对象。
ServiceRegistry serviceRegistry=new StandardServiceRegistryBuilder()
.applySettings(config.getProperties()).build(); //通过config.getProperties()读取配置文档。
//创建会话工厂对象
SessionFactory sessionFactory=config.buildSessionFactory(serviceRegistry);
//创建会话对象
Session session=sessionFactory.openSession();
//开启事务
Transaction transaction=session.beginTransaction();
//创建一个学生对象
Address add=new Address("7932322","武当山","312321");
//创建一个学生主键对象
StudentsPK pk=new StudentsPK();
pk.setId("93328217421234834");
pk.setSid("94323423");
Students s=new Students(pk,"张三丰","男",new Date(),"太极拳",add); session.save(s);
transaction.commit(); }
后来发现是这句话的原因导致报错:这句话会去调用hbm.xml,因为这里没有使用hbm.xml的方式,使用的注解方式。
config.addClass(Students.class);
ServiceRegistry serviceRegistry=new StandardServiceRegistryBuilder()
.applySettings(config.getProperties()).build(); //通过config.getProperties()读取配置文档。
改成如下方式:
@Test
public void testAddStudents()
{
//创建配置对象
Configuration config=new Configuration().configure();
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build();
//创建会话工厂对象
SessionFactory sessionFactory=config.buildSessionFactory(serviceRegistry);
//创建会话对象
Session session=sessionFactory.openSession();
//开启事务
Transaction transaction=session.beginTransaction();
//创建一个学生对象
Address add=new Address("7932322","武当山","312321");
//创建一个学生主键对象
StudentsPK pk=new StudentsPK();
pk.setId("93328217421234834");
pk.setSid("94323423");
Students s=new Students(pk,"张三丰","男",new Date(),"太极拳",add); session.save(s);
transaction.commit();
}
@Transient
可选,表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性。如果一个属性并非数据库表的字段映射,
必须将其标示为@Transient,否则ORM框架默认其注解为@Basic。

02-hibernate注解-属性级别注解的更多相关文章
- Hibernate注解----类级别注解以及属性注解详解----图片版本
这篇文章是我在慕课网上学习Hibernate注解的时候进行手机以及整理的笔记. 今天把它分享给大家,希望对大家有用.可以进行收藏,然后需要的时候进行对照一下即可.这样能起到一个查阅的作用. 本文主要讲 ...
- Hibernate学习之属性级别注解
© 版权声明:本文为博主原创文章,转载请注明出处 属性级别注解 添加方式 1. 写在属性字段上面 2. 写在属性getter方法上面 @Id:必须,定义了映射到数据库表的主键属性,一个实体可以有一个或 ...
- Hibernate学习之类级别注解
© 版权声明:本文为博主原创文章,转载请注明出处 类级别注解: 1. @Entity 实体:表示映射实体类,使用@Entity时必须指定实体类的主键属性 @Entity(name="&quo ...
- Hibernate注解-类级别注解
- 01-hibernate注解:类级别注解准备工作
注解简介: 目的:为了简化繁琐的ORM映射文件(.hbm)的配置. JPA与hibernate的关系 JPA:全称 java Persistence API(java持久化API接口) JPA注解是J ...
- Hibernate注解开发、注解创建索引
1.注解的目的 简化繁琐的ORM映射文件(*.hbm)的配置 2.JPA和hibernate的关系 JPA:java persistence API,JPA注解是JavaEE的标准和规范. 两者的关系 ...
- Hibernate注解----关联映射注解以及课程总结详解----图片版本
上一篇,记录了Hibernate注解----类级别注解以及属性注解详解 ,我们这一节主要讲解的是Hibernate注解----关联映射注解以及课程总结详解. 本节的主要内容: 第3章 关联映射注解 3 ...
- Hibernate关系映射(注解)
1.类级别注解 @Entity 映射实体类 @Table 映射数句库表 @Entity(name="tableName") - 必须,注解将一个类声明为一个实体bea ...
- java自定义注解知识实例及SSH框架下,拦截器中无法获得java注解属性值的问题
一.java自定义注解相关知识 注解这东西是java语言本身就带有的功能特点,于struts,hibernate,spring这三个框架无关.使用得当特别方便.基于注解的xml文件配置方式也受到人们的 ...
随机推荐
- 【js】js数组置空的三种方式
方式1: var arr = new Array(1,2,3); alert(arr); arr.splice(0, arr.length); alert(arr); 方式2: var arr = n ...
- fmri数据分析图像格式及转换问题——基于spm讨论
1.几大常用格式 这张ppt介绍了现在常用的三种格式:dicom主要由扫描器产生,一般是一个slice一个文件:analyze 格式= .img/.hdr spm下用的最多:nifti ,由fsl & ...
- mongo 误操作恢复数据
场景:我往同一个集合里面插入 三条数据 aa:aa bb:bb cc:cc .后来我后悔了,不想插入 bb:bb,通过oplog重放过滤好 bb:bb这条数据. 原理: 1.通过 oplog.r ...
- IP编址
IP地址 /include/linux/inetdevice.h,定义IPV4专用的网络设备相关的结构.宏等 /net/ipv4/devinet.c.支持IPV4特性的设备操作接口 数据组织 net_ ...
- Foreach控件使用
在SSIS中,Foreach控件可以循环处理选中的文件中的文件,例如sql文件,Excel文件等.下面就介绍一个比较经典的案例,将一个文件夹中包含的多个Excel文件循环导入至数据库中. 第一步:在数 ...
- Objective-C:KVC机制
KVC:key value coding 键值对的编码 功能:用来给对象属性设置值或者取出对象属性的值.虽然getter和setter方法也是该功能,但是如果类中没有设置属性特性或者重写这两个方 ...
- cmake处理多源文件目录的方法
cmake处理源代码分布在不同目录中的情况也很简单,现在假设我们的源代码分布情况如下: 源代码的分布情况 其中src目录下的文件要编译成一个链接库 第一步,项目主目录中的CMakelist.txt 在 ...
- Git系列二之数据管理
1.Git基本管理 git常用的基本操作 1.1提交数据 我们可以简单的把工作目录理解成是一个被Git服务程序管理的目录,Git会时刻的追踪目录内文件的改动,另外在安装好了Git服务程序后,默认就会创 ...
- material.setTexture("sampler",tex) assetbundle 下失效
做镜面反射本来写很顺 在手机上测的时候 发现settexture这里绑不上 查好久 是assetbundle的缘故 因为动态加载的 obj用了mat01 我在反射脚本里动态修改mat01而不是拿 re ...
- Spark详解
原文连接 http://xiguada.org/spark/ Spark概述 当前,MapReduce编程模型已经成为主流的分布式编程模型,它极大地方便了编程人员在不会分布式并行编程的情况下,将自己的 ...