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文件配置方式也受到人们的 ...
随机推荐
- ubuntu问题集锦
我使用的是ubuntu 14.04 用UltraIOS 制作镜像安装的 ubuntu 问题1:闪屏问题以及文字显示不全 解决方案:重装显卡驱动 解决过程:http://my.oschina.net/ ...
- <四边形不等式优化>[NOI1995]石子合并
留个坑 挺套路的 明天来写个总结 #include<cstdio> #include<algorithm> inline int read() { int x = 0,f = ...
- [CF985G]Team Players
题意:给出一个图,求$\sum\limits_{\substack{i\lt j\lt k\\\nexists(i,j),(j,k),(i,k)}}Ai+Bj+Ck$ 挺好的一道题==,就是稍微毒了点 ...
- 【DFS】Gym - 100781A - Adjoin the Networks
给你一个森林,让你把它连接成一颗树,使得直径最小. 就求出每颗树的重心以后,全都往直径最大的那个的重心上连,一般情况是最大/2+次大/2+1,次大/2+第三大/2+2 中取较大者. 还有些特殊情况要特 ...
- 升级到XCode6后,iOS8里设置tableview的setSeparatorInset:UIEdgeInsetsZero不起作用的解决办法
我们在使用tableview时会发现分割线的左边会短一些,通常可以使用 setSeparatorInset:UIEdgeInsetsZero 来解决.但是升级到XCode6之后,在iOS8里发现没有效 ...
- 动画clip仅仅读的解决的方法,以及动画关键帧回调的办法
之前在Asset store上面下载了一个模型,有动画,可是想在Animation窗体编辑动画,插入关键帧的时候,出现了一点问题,发现动画切片是可读的. 在网上查了一下解决方式,后来在这里找到了答案: ...
- 《SQL Server企业级平台管理实践》读书笔记
http://www.cnblogs.com/zhijianliutang/category/277162.html
- webpack与browser-sync热更新原理深度讲解
本文首发于CSDN网站,下面的版本又经过进一步的修订.原文:webpack与browser-sync热更新原理深度讲解本文包含如下内容: webpack-hot-middleware EventSou ...
- Font Include Sass Mixin
前端开发whqet,csdn,王海庆,whqet,前端开发专家 前期以前给大家介绍过一个使用google font的mixin(详见<Google Fonts Sass Mixin>),今 ...
- 1:MUI选择器组件抛出“n.getSelectedItem is not a function”异常的解决办法 2:mui三级联动 3:移动端关闭虚拟键盘
1:如下图 问题:引用了mui的地址选择的三级联动的应用在h5上的组件 百度发现别人思路对 Array 原型链方法扩充时,会抛出这个异常. 修改方法: mui.poppicker.js 第 112 行 ...