添加方式:

一是写在属性字段上面。

二是写在属性的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 无参数的构造方法,必须重写覆盖equalshashCode方法。

实例:

第一步:新建一个复合主键的嵌入类。

需要注意: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注解-属性级别注解的更多相关文章

  1. Hibernate注解----类级别注解以及属性注解详解----图片版本

    这篇文章是我在慕课网上学习Hibernate注解的时候进行手机以及整理的笔记. 今天把它分享给大家,希望对大家有用.可以进行收藏,然后需要的时候进行对照一下即可.这样能起到一个查阅的作用. 本文主要讲 ...

  2. Hibernate学习之属性级别注解

    © 版权声明:本文为博主原创文章,转载请注明出处 属性级别注解 添加方式 1. 写在属性字段上面 2. 写在属性getter方法上面 @Id:必须,定义了映射到数据库表的主键属性,一个实体可以有一个或 ...

  3. Hibernate学习之类级别注解

    © 版权声明:本文为博主原创文章,转载请注明出处 类级别注解: 1. @Entity 实体:表示映射实体类,使用@Entity时必须指定实体类的主键属性 @Entity(name="&quo ...

  4. Hibernate注解-类级别注解

  5. 01-hibernate注解:类级别注解准备工作

    注解简介: 目的:为了简化繁琐的ORM映射文件(.hbm)的配置. JPA与hibernate的关系 JPA:全称 java Persistence API(java持久化API接口) JPA注解是J ...

  6. Hibernate注解开发、注解创建索引

    1.注解的目的 简化繁琐的ORM映射文件(*.hbm)的配置 2.JPA和hibernate的关系 JPA:java persistence API,JPA注解是JavaEE的标准和规范. 两者的关系 ...

  7. Hibernate注解----关联映射注解以及课程总结详解----图片版本

    上一篇,记录了Hibernate注解----类级别注解以及属性注解详解 ,我们这一节主要讲解的是Hibernate注解----关联映射注解以及课程总结详解. 本节的主要内容: 第3章 关联映射注解 3 ...

  8. Hibernate关系映射(注解)

    1.类级别注解 @Entity     映射实体类 @Table    映射数句库表 @Entity(name="tableName") - 必须,注解将一个类声明为一个实体bea ...

  9. java自定义注解知识实例及SSH框架下,拦截器中无法获得java注解属性值的问题

    一.java自定义注解相关知识 注解这东西是java语言本身就带有的功能特点,于struts,hibernate,spring这三个框架无关.使用得当特别方便.基于注解的xml文件配置方式也受到人们的 ...

随机推荐

  1. Linux含交互的自动登录脚本

    近来经常要通过ssh登录服务器,每次输入命令和密码很麻烦,查资料发现有两种解决,一种是本地创建密钥直接登录,另一种是写个脚本. 这里介绍第二种方法,第一种资料也很多,但是觉得没啥意思. 先上脚本: # ...

  2. android用户界面的教程实例---转自qianqianlianmeng的博客

    1.android用户界面之AlarmManager教程实例汇总http://www.apkbus.com/android-48405-1-1.html2.android用户界面之文本编辑教程实例汇总 ...

  3. [Codeforces 1053B] Vasya and Good Sequences

    Link: Codeforces 1053B 传送门 Solution: 其实就是暴力 观察需要满足的条件: 1.个数和为偶数 2.最大个数不大于其它所有个数的和 如果只有第一个条件记录前缀和的奇偶性 ...

  4. 你真的完全了解Java动态代理吗?看这篇就够了

    之前讲了<零基础带你看Spring源码--IOC控制反转>,本来打算下一篇讲讲Srping的AOP的,但是其中会涉及到Java的动态代理,所以先单独一篇来了解下Java的动态代理到底是什么 ...

  5. Problem B: 判断回文字符串

    #include<stdio.h> #include<string.h> int huiwen(char *str) //定义回文函数 { //char ch[100]; in ...

  6. Java程序运行时内存划分

    1.Java程序跨平台运行的原因 主要原因是:各种平台的JVM和字节码文件 Java源程序--具体平台的机器代码文件---被编译器翻译成平台无关的Class文件,又用特定JVM运行字节码文件,JVM在 ...

  7. while an existing transition or presentation is occurring; the navigation stack will not be updated

    使用UIAlertController提示信息,在之后使用navigation进行逻辑跳转时,出现popToViewController:transition: called on <UINav ...

  8. OPENCV下SIFT算法使用方法笔记

    这几天继续在看Lowe大神的SIFT神作,看的眼花手脚抽筋.也是醉了!!!!实在看不下去,来点干货.我们知道opencv下自带SIFT特征检测以及MATCH匹配的库,这些库完全可以让我们进行傻瓜似的操 ...

  9. 性能问题: SQL*Net message from client 等待时间太长

    今天我终于自己遇到了这个问题, PO form 打不开了, 看了下 trace 发现 SQL*Net message from client 等待时间太长. 但是这不可能是网络问题, 这个环境是在我电 ...

  10. AWR报告简易分析

    Snap Id Snap Time Sessions Cursors/Session Begin Snap: 35669 2012-11-8 13:00 1246 11.3 End Snap: 356 ...