Hibernate常见术语、操作、区别

本文详细介绍Hibernate框架的核心接口、工作原理及关系映射等关键技术,并探讨了对象状态、缓存机制、主键生成策略、查询方式等内容。

原创转载请注明出处:http://agilestyle.iteye.com/blog/2359961

 

Hibernate核心接口

Configuration

SessionFactory

Session

Query

Criteria

Transaction

 

Hibernate工作原理

配置Configuration对象,读取并解析配置文件

读取并解析映射信息,创建SessionFactory

创建session对象

开启事务Transaction

完成CRUD持久化操作

提交事务

关闭session

 

Hibernate关系映射

@ManyToOne(fetch默认FetchType是eager)

@OneToMany(fetch默认FetchType是lazy)

@OneToOne(fetch默认FetchType是eager)

@ManyToMany(fetch默认FetchType是lazy)

 

Hibernate对象状态

Transient

Persistent

Detached

Customer customer = new Customer();		// new之后,不处于Session的缓存中:临时态
session.save(customer);
// 处于这两句之间,已经被持久化,加入到Session的缓存中:持久态
transaction.commit();
session.close();
// session关闭之后,已经被持久化,但不再处于Session的缓存中:游离态

 

Hibernate的缓存等级及其特点

一级缓存就是Session级别的缓存,一个Session做了一个查询操作,它会把这个操作的结果放在一级缓存中,如果短时间内这个session(一定要同一个session)又做了同一个操作,那么hibernate直接从一级缓存中拿,而不会再去连数据库取数据。

二级缓存就是SessionFactory级别的缓存,顾名思义,就是查询的时候会把查询结果缓存到二级缓存中,如果同一个sessionFactory创建的某个session执行了相同的操作,hibernate就会从二级缓存中拿结果,而不会再去连接数据库。

 

Hibernate有哪些主键

TABLE

SEQUENCE

IDENTITY

AUTO

 

Hibernate有几种查询数据的方式

有三种查询方式

  • HQL:Hibernate Query Language,它跟SQL非常类似
  • Criteria Query,以对象的方式添加查询条件
  • SQL,直接使用SQL语句操作数据库

Hibernate的Set, List, Bag, Map有什么异同

List可以重复,有序的一种集合

Bag(结合了List与Set),可以重复且没有顺序的一种集合,是Hibernate提供的

Set不可以重复,没有顺序的一种集合

Map是key-value对形式的一种映射

 

Hibernate中session.save()和session.persist()的区别

session.save()返回的是Serializable

session.persist()返回的是void


 

Hibernate中load()方法和get()方法的区别

load()与get()方法都可以根据标识符属性值查询获取一个持久化对象,但是在为找到符合条件的持久化对象时,load()方法抛出违例;get()方法返回null。

get()方法先从Hibernate一级缓存中查询符合条件的对象,找不到则直接从数据库中查找记录;

而load()方法则从Hibernate先从Hibernate的一级缓存中查找符合条件的对象,找不到还会在Hibernate的二级缓存中查找对象,仍未找到才会查找数据库。

 

Hibernate中inverse属性的作用

在Hibernate中一对多的单向或者双向关联的情况下,我们可以将“一”方控制权交给“多”方,称为“控制反转”(inverse),代码中使用控制反转需要在一方的映射文件中设置inverse属性为true,该属性的默认值为false。

 

Hibernate的检索策略

HQL

// 创建一个Query对象
Query query = session.createQuery("from Customer as c where c.name = :customerName" and c.age = :customerAge");
// 动态绑定参数
query.setString("customerName", "Tom");
query.setInteger(customerAge", 21);
// 执行查询,返回查询结果
List result = query.list();

方法链编程风格
List result = session.createQuery("from Customer as c where c.name = :customerName" and c.age = :customerAge")
	.setString("customerName", "Tom")
	.setInteger("customerAge", 21)
	.list();

QBC

// 创建一个Criteria对象
Criteria criteria = session.createCriteria(Customer.class);
// 设定查询条件,然后把查询条件加入到Criteria中
Criterion criterion1 = Expression.like("name", "T%");
Criterion criterion2 = Expression.eq("age", new Integer(21));
criteria = criteria.add(criterion1);
criteria = criteria.add(criterion2);
// 执行查询语句,返回查询结果
List result = criteria.list();

方法链编程风格
List result = session.createCriteria(Customer.class)
	.add(Express.like("name", "T%"))
	.add(Express.eq("age", new Integer(21)))
	.list();

 

Hibernate分页查询

采用HQL检索方式

Query query = session.createQuery("from Customer c order by c.name asc");
query.setFirstResult(0);
query.setMaxResult(10);
List result = query.list();

采用QBC检索方式

Criteria criteria = session.createCriteria(Customer.class);
criteria.addOrder(Order.asc("name"));
criteria.setFirstResult(0);
criteria.setMaxResult(10);
List result = criteria.list();

  

 

 

 

 

 

<think> 嗯,用户询问如何在SAP系统中修改采购订单供应商信息。这是一个典型的SAP MM模块操作问题,需要结合系统功能和引用内容综合分析。 从引用资料看,用户提供的参考内容主要涉及采购信息记录修改(ME12)、采购单位确定逻辑、采购订单基本概念及发票校验流程,但没有直接说明采购订单供应商修改方法。不过引用[2]提到采购订单参考其他凭证创建时会复制源数据,这可能影响修改权限。 用户的核心痛点应是采购订单创建供应商信息错误的修正场景。根据SAP标准逻辑,采购订单一旦创建,关键字段如供应商、物料号在后续业务发生后通常会被锁定。需要分两种情况处理: 1. 无后续业务时:可通过ME22N直接修改供应商字段。但要注意若订单是参照创建(如合同转订单),需先检查源凭证的供应商设定,引用[2]明确说明参照生成的订单单位字段为灰色不可改,供应商字段同理。 2. 已有收货或发票时:必须使用归档流程。引用[4]展示的发票校验历史记录表明,系统会严格跟踪订单状态变化。此时直接修改供应商会导致业务数据断裂,标准方案是: - 取消已关联的收货/发票凭证 - 冻结原订单 - 创建订单给正确供应商 这点在引用资料中虽未明说,但发票校验的强关联性(MIRO必须匹配入库凭证)已暗示数据完整性的约束。 用户可能是采购专员或MM顾问,ta特意强调“修改”而非“创建”,说明遇到的是订单修正的实际问题。隐含需求可能是想了解修改失败时的报错处理,比如常见的“字段不可修改”消息(类似引用[2]提到的ME898消息)。 需要补充应急预案:若供应商修改失败导致订单阻塞,可通过ME22N冻结订单并在文本说明栏标注异常,避免后续误操作。同时提示测试环境演练的重要性——引用[1][4]都强调本文仅用于学习,侧面反映生产系统直接操作的风险。 </think> 在SAP系统中修改采购订单供应商需根据订单状态采取不同操作,以下是具体方法和注意事项: ### 一、直接修改(仅限无后续业务时) 1. **适用场景**:订单尚未触发收货(GR)或发票校验(MIRO) 2. **操作步骤**: ```trans 事务代码 ME22N → 输入采购订单号 → 直接修改供应商字段 → 保存 ``` > ⚠️ 若订单通过其他凭证(如合同)创建供应商字段可能被锁定(灰色不可编辑),需先取消参照关系[^2]。 ### 二、存在后续业务时的强制修改 若已发生收货或发票,需按流程重置业务: 1. **逆向操作顺序**: ```mermaid graph LR A[冲销发票校验 MIRO/MIRR] --> B[冲销收货 MIGO] --> C[冻结原订单] --> D[创建订单给新供应商] ``` - **冲销发票**:事务码`MIRR`,引用凭证号(见采购订单历史[^4]) - **冲销收货**:事务码`MBST`,选择对应物料凭证 - **冻结旧订单**:ME22N中设置"冻结"标识 2. **创建订单**: - 使用`ME21N`为新供应商创建订单 - 复制原订单项目时,需手动更新价格条件(新供应商可能适用不同价格) ### 三、关键限制与建议 1. **系统约束**: - 若订单通过参照创建(如合同转订单),供应商字段禁止修改(系统报错ME898)[^2] - 已审批的订单需先释放审批状态 2. **审计要求**: - 修改后系统自动生成修改记录(事务码ME80FN可查看) - 重大变更建议通过备注说明原因(ME22N文本字段) 3. **替代方案**: ```table | 场景 | 解决方案 | |-------|---------| | 少量交货错误 | 对新供应商创建退货订单→原供应商 | | 长期供应商切换 | 终止原信息记录→新建供应商主数据 | ``` > 📌 **操作警示**:直接修改供应商可能导致后续业务断裂(如发票校验差异[^4]),务必在测试系统验证后再执行生产系统操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值