Hibernate注解

本文介绍Hibernate中使用注解配置实体类的方法,并详细解释了不同注解的用途,如@Id、@Column等。此外,还展示了如何利用Hibernate Query Language (HQL) 进行查询、更新、删除等操作,包括条件筛选、排序、分组等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用注解的配置:




-------------------------------------------------------------------------
使用基本注解保存无关联实体:


public class Test_1 {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// 1.创建session
Session session = HibernateSessionFactory.getSession();
// 2.创建事务
Transaction tx = session.beginTransaction();
// 3.进行操作
//使用基本注解保存无关联实体
Author author=new Author("19号","123");
try {
session.save(author);
tx.commit();
} catch (Exception e) {
// TODO: handle exception
tx.rollback();
}
// 4.关闭session
session.close();
}

}

使用注解方式保存关联实体:


public class Test_2 {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// 1.创建session
Session session = HibernateSessionFactory.getSession();
// 2.创建事务
Transaction tx = session.beginTransaction();
// 3.进行操作
// 使用注解方式保存关联实体
Author author = new Author("龟仙人", "123");
Blog blog = new Blog("好色");
blog.setAuthor(author);
try {
session.save(blog);
tx.commit();
} catch (Exception e) {
// TODO: handle exception
tx.rollback();
}
// 4.关闭session
session.close();

}

}

注解的方式是把配置文件写在实体里了,其它基本类似


-------------------------------------------------------------------------------------------------

@Id——声明了该实体的标识属性,该属性对应表中的主键
@Id
private Long id;

@Column——声明了属性到列的映射
@Column(name="addr")
private String address
name 可选,列名(默认值是属性名)
unique 可选,是否在该列上设置唯一约束(默认值false)
nullable 可选,是否设置该列的值可以为空(默认值false)
insertable 可选,该列是否作为生成的insert语句中的一个列(默认值true)
updatable 可选,该列是否作为生成的update语句中的一个列(默认值true)
@GeneratedValue——声明了主键的生成策略,该注解的strategy属性指定了主键生成策略,默认值为GenerationType.AUTO
GenerationType.AUTO ,自动选择最适合底层数据库的主键生成策略
GenerationType.IDENTITY, 对于MySQL、SQL Server这样的数据库选择自增长的注解生成策略
GenerationType.SEQUENCE,对于Oracle这样的数据库,选择使用基于sequence的主键生成策略,它与@SequenceGenerator共同使用

@ManyToOne属性说明

属 性 是否必需 说 明
cascade 指定对关联实体所采用的级联策略,该级联策略支持如下五个属性值:
CascadeType.ALL:将所有的持久化操作都级联到关联实体
CascadeType.PERSIST:将persist操作级联到关联实体
CascadeType.MERGE:将merge操作级联到关联实体
CascadeType.REFRESH:将refresh操作级联到关联实体
CascadeType.REMOVE:将remove操作级联到关联实体
fetch 指定抓取关联实体时的抓取策略,该属性支持以下两个属性值:
FetchType.EAGER:抓取实体时,立即抓取关联实体,这是默认值
FetchType.LAZY:抓取实体时,延迟抓取关联实体,等到真正用到关联实体时才去抓取
targetEntity 该属性指定关联实体的类名。在默认情况下,系统将通过反射来判断关联实体的类名。


@JoinColumn属性说明

属 性 是否必需 说 明
name 指定该外键列的列名
inserttable 指定该列是否包含在insert语句的列表中,默认值为true
updatetable 指定该列是否包含在update语句的列表中,默认值为true
nulltable 指定该列是否允许为null,默认值为true
unique 指定是否为该列增加唯一约束


@JoinTable属性说明
属 性 是否必需 说 明
name 指定连接表的表名
joinColumns 该属性可以接受多个@JoinColumn,用于配置连接表中外键列的列信息,这些外键列参照当前实体的主键列
inverseJoinColumns 该属性可以接受多个@JoinColumn,用于配置连接表中外键列的列信息,这些外键列参照当前实体的关联实体的主键列

--------------------------------------------------------------------------------


HQL支持的运算符
运算类型 HQL运算符 含 义
比较运算 = 等于
<> 不等于
> 大于
>= 大于等于
< 小于
<= 小于等于
is null 为空
is not null 不为空
范围运算 in 等于列表中的某一个值
not in 不等于列表中的任意一个值
between 值1 and 值2 大于等于值1且小于等于值2
not between值1 and 值2 小于值1或大于值2
字符串模式匹配 like 字符串模式匹配
逻辑运算 and 逻辑与
or 逻辑或
not 逻辑非


HQL查询:
public class Test_3 {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// 1.创建session
Session session = HibernateSessionFactory.getSession();
// 2.创建事务
Transaction tx = session.beginTransaction();
// 3.进行操作
//HQL查询
String hql=" from Blog b where b.id=:id ";
Query query=session.createQuery(hql);
query.setInteger("id", 1);
List<Blog> list= query.list();
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i).getTitle());
}
// 4.关闭session
session.close();
}

}


HQL删除:
public class Test_4 {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// 1.创建session
Session session = HibernateSessionFactory.getSession();
// 2.创建事务
Transaction tx = session.beginTransaction();
// 3.进行操作
//HQL删除
String hql=" delete Blog b where b.id=42 ";
Query query=session.createQuery(hql);
query.executeUpdate();
tx.commit();
System.out.println("删除完成");
// 4.关闭session
session.close();
}

}

HQL更新:
public class Test_5 {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// 1.创建session
Session session = HibernateSessionFactory.getSession();
// 2.创建事务
Transaction tx = session.beginTransaction();
// 3.进行操作
//HQL更新
String hql=" update Blog b set b.type='动漫' where b.title='美食论' ";
Query query=session.createQuery(hql);
query.executeUpdate();
tx.commit();
System.out.println("更新完成");
// 4.关闭session
session.close();

}

}

HQL排序:
public class Test_6 {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// 1.创建session
Session session = HibernateSessionFactory.getSession();
// 2.创建事务
Transaction tx = session.beginTransaction();
// 3.进行操作
//HQL排序
String hql=" from Blog b order by author_id";
Query query=session.createQuery(hql);
List<Blog> list= query.list();
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i).getTitle());
};
// 4.关闭session
session.close();

}

}


HQL分组:

public class Test_7 {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// 1.创建session
Session session = HibernateSessionFactory.getSession();
// 2.创建事务
Transaction tx = session.beginTransaction();
// 3.进行操作
//HQL分组
String hql="select type,count(*) from Blog b group by b.type";
Query query=session.createQuery(hql);
List<Object[]> list= query.list();
for (int i = 0; i < list.size(); i++) {
Object[] obj=list.get(i);
System.out.println("类型:"+obj[0]);
System.out.println("数量:"+obj[1]);
};
// 4.关闭session
session.close();

}

}


public class Test_8 {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// 1.创建session
Session session = HibernateSessionFactory.getSession();
// 2.创建事务
Transaction tx = session.beginTransaction();
// 3.进行操作
//HQL分组 查询作者的博客数量
String hql="select author,count(*) from Blog b group by b.author";
Query query=session.createQuery(hql);
List<Object[]> list= query.list();
for (int i = 0; i < list.size(); i++) {
Object[] obj=list.get(i);
System.out.println("作者:"+((Author)obj[0]).getUsername());
System.out.println("数量:"+obj[1]);
};
// 4.关闭session
session.close();

}

}
分页:
public class Test_9 {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// 1.创建session
Session session = HibernateSessionFactory.getSession();
// 2.创建事务
Transaction tx = session.beginTransaction();
// 3.进行操作
// HQL分页
// int page=1; //当前页数
int count = 3; // 数量
String hql = " from Blog ";
Query query = session.createQuery(hql);
for (int page = 1; page <= 4; page++) {
System.out.println("第" + page + "页:");
List<Blog> list = query.setFirstResult((page - 1) * count)
.setMaxResults(count).list();
for (int i = 0; i < list.size(); i++) {
System.out.println("作者:" + list.get(i).getTitle());
};
}
// 4.关闭session
session.close();
}

}

联合查询:

public class Test_1 {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// 1.创建session
Session session = HibernateSessionFactory.getSession();
// 2.创建事务
Transaction tx = session.beginTransaction();
// 3.进行操作
//HQL联合查询
String hql=" from Author a inner join a.blogs";
Query query=session.createQuery(hql);
List<Object[]> obj= query.list();
for (int i = 0; i < obj.size(); i++) {
System.out.print("作者:"+((Author)obj.get(i)[0]).getUsername());
System.out.print("博客:"+((Blog)obj.get(i)[1]).getTitle()+"\n");
};
// 4.关闭session
session.close();
}

}

子查询:

public class Test_2 {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// 1.创建session
Session session = HibernateSessionFactory.getSession();
// 2.创建事务
Transaction tx = session.beginTransaction();
// 3.进行操作
//HQL子查询
String hql=" from Author a where (select count(*) from a.blogs )=2 ";
Query query=session.createQuery(hql);
List<Author> obj= query.list();
for (int i = 0; i < obj.size(); i++) {
System.out.println("作者:"+obj.get(i).getUsername());
};
// 4.关闭session
session.close();

}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值