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文件配置方式也受到人们的 ...
随机推荐
- Linux运维 -- 文件备份同步系列
[1.]文件备份与恢复 #()整盘数据备份-->另一个盘/一个image文件 dd if=/dev/sdb of=/dev/sde #备份到指定的image文件中 dd if=/dev/sdb ...
- Beaglebone Black教程BeagleBone Black安装最新系统映像
Beaglebone Black教程BeagleBone Black安装最新系统映像 BeagleBone Black安装最新系统映像 Beaglebone Black虽然已经预装了Debian操作系 ...
- VB查询数据库之导出表格——机房收费总结(四)
在机房收费系统中,有几个窗体需要导出数据到EXCEL表格中,如:学生上机记录查询窗体.学生充值记录查询窗体.收取金额查询窗体等. 前面的几篇总结,大家建议我不要把代码写的太详细,这样,不利于读者思考, ...
- 【DFS】【DP】岳麓山上打水
[vijos1159]岳麓山上打水 描述 今天天气好晴朗,处处好风光,好风光!蝴蝶儿忙啊,蜜蜂也忙,信息组的同学们更加忙.最近,由于XX原因,大家不得不到岳麓山去提水.55555555~,好累啊. 信 ...
- BZOJ 1305 [CQOI2009]dance跳舞(二分+网络流)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1305 [题目大意] 一次舞会有n个男孩和n个女孩. 每首曲子开始时,所有男孩和女孩恰好 ...
- 【主席树】Gym - 101237A - MEX-Query
主席树里每个值的位置存当前该值出现的最右位置. 如果root[r]的前缀主席树中,某值最右位置大于等于l,说明该值出现在了l,r中. 所以主席树维护区间最小值,如果左半值域的最小值<l,则说明左 ...
- lib_chan库学习
-module(lib_chan_cs). %% 实现服务器端结构和机制的模块 -export([start_raw_server/4, start_raw_client/3]). -export([ ...
- [转] Mybatis 示例之 SelectKey
SelectKey在Mybatis中是为了解决Insert数据时不支持主键自动生成的问题,他可以很随意的设置生成主键的方式. 不管SelectKey有多好,尽量不要遇到这种情况吧,毕竟很麻烦. sel ...
- Codeforces Round #127 (Div. 1) A. Clear Symmetry 打表
A. Clear Symmetry 题目连接: http://codeforces.com/contest/201/problem/A Description Consider some square ...
- Ubuntu 16.04安装RedisDesktopManager
说明:0.9版本的安装补上,只能安装0.8版本的. 官网: https://github.com/uglide/RedisDesktopManager 下载: https://github.com/u ...