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文件配置方式也受到人们的 ...
随机推荐
- 【Maven】maven的常用命令以及搭建maven私人仓库
一.maven环境搭建 1. 二.maven常用命令 1.创建一个新的项目: mvn archetype:create -DgroupId=com.puyangsky.test -DartifactI ...
- 桌面笔记工具KeepNote
桌面笔记工具KeepNote 在渗透测试过程中,安全人员经常需要记录各种数据,如输出结果.运行截图.测试心得.这类信息格式多样,可能是图片.文字.文件等.为了便于管理这些内容,Kali Linux ...
- 【BZOJ 4103】【THUSC 2015】异或运算
http://www.lydsy.com/JudgeOnline/problem.php?id=4103 对长的那一维建可持久化trie树(主席树?) 最主要的思路是对短的那一维每一位暴力,每一位都记 ...
- [BZOJ2007][NOI2010]海拔(对偶图最短路)
首先确定所有点的海拔非0即1,问题转化成裸的平面图最小割问题,进而转化成对偶图最短路(同BZOJ1002). 这题的边是有向的,所以所有边顺时针旋转90度即可. 如下图(S和T的位置是反的). #in ...
- CodeForces - 965D Single-use Stones
题面在这里! 如果你强行把问题建模,可以发现这是一个裸的增广路,又因为这是区间连边,所以跑一个 点数O(N)边数O(N log N)的线段树优化建边的网络流即可,不知道能不能过23333 但其实这个问 ...
- HihoCoder - 1715 树的连通问题
题面在这里! 正式告别文化课回归的第一题QWQ,然鹅半个月之后还是要退役QWQWQWQWQ 好像很久之前就见过的一个题,当时只会打一打 O(N^2) 的暴力QWQ,正好今天又写了遍这个暴力用来对拍23 ...
- [Lydsy1805月赛] quailty 算法
稍微建一下模型就可以发现,题目要求的其实是一个最小异或基环森林.... 可以用类似最小生成树的拟阵性质来证明,贪心的从小的边权开始依次尝试加入的方法是对的. 所以我们把a[]排完序之后直接递归贪心就行 ...
- FZU 2105 Digits Count(按位维护线段树)
[题目链接] http://acm.fzu.edu.cn/problem.php?pid=2105 [题目大意] 给出一个序列,数字均小于16,为正数,每次区间操作可以使得 1. [l,r]区间and ...
- maven打包出现找不到java.lang包的问题
修改pom文件中的bootclasspth路径为${java.home}/lib/rt.jar;${java.home}/lib/jce.jar windows为分号 linux为冒号
- 【MySQL笔记】字符串、时间日期转换
1.新增一列,将字符串日期(年.月.日)转换为Date类型 报错:Error Code: 1175. You are using safe update:http://jingyan.baidu. ...