Hibernate 面向性能的设计[转自http://9prior.bc-cn.net ]

本文介绍了一种使用ORM技术处理不同类型实体对象的高级方法。通过在主表中增加Category字段区分子类,并利用Hibernate的discriminator节点自动识别不同类别的实体,实现了一个大类对应一个大表的数据存储方案。

针对每个实体所涉及到的具体属性不同的特点,比如一个商品类中,书本有页数属性,DVD有区码属性,如果针对不同的对象建一张独立的表
不行。可以把不同对象相同的地方归类到一个公共类,然后用Table per subclass来处理,具体如下
针对不同对象不同属性先分别建不同对象特有属性的子表,字段只是特有属性就OK
然后在公共类的映射文件中用<joined-subclass
name="子类具体路径"
table="对应子表">
<key column="id"/>

<property name="pageCount"
column="pagecount">
</joined-subclass>

然后写如下测试代码:
TBook book=new TBook();
book.setpagecount(23);
book.setName("NO excuse");
TDvd dvd=new TDvd();
dve.setName(spain man );
dve.setRegioncode(6);

try{

Transaction tx=session.beginTransaction();
session.save(book);
session.save(dvd);
tx.commit();

}
catch(HibarnateException e)

{
......
}


不过有一种更好的区别子类的方法
在主表中增加一个Category字段用来标示字类,
假如category=1表示的是书
category=2表示的DVD
那么在Hibernate 映射文件中的discriminator节点,则可以定义根据category自动识别对应的class类型的功能。
注意。是自动的,以下代码你就知道了。
在TItem.hbm.xml
<hibernate-mapping>
<class name="item类的具体路径 table="T_ITEM">
<id name="id" column="id">
<generator class="native"/>
</id>
<discriminator column="category" type="string"/ >
<property name="name" column="name">
<property 其他公共部分的属性>
<subclass name="字类的具体路径(注意是个真实的类)" discriminator-value="1">
<property name="pageCount" column="pagecount"/><!--对应的字类特殊字段,也就是说这个是我字类特有的属性了-->
</subclass>
<subclass name="字类的具体路径" discriminator-value="2">
<property name="Code" column="code"/>
</subclass>


</hibernate-mapping>
这样,在运行Hibernate读取T_ITEM表数据时,会根据指定的category来进行判断,如果category字段值为1,则映射到
TBook。如果是2则把数据映射到TDVD生成实例对象。
然后看下测试类

List list =session.createQuery("from TBook").list();
Iterator it=list.iterator();
while(it.hasNext())
{
TBook book=(TBook)it.next();
System.out.println(book.getName());

}
输出来的真的是book里面的Name哦。。。这种方法近似于父类和其子类映射的解决之道,既一个大类对应有一个大表
,大表有些属性是字类特有的,通过category来识别加载子类。


#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice. #Thu Mar 13 17:09:06 CST 2025 https\://repos.iec.io/repository/maven-zzy/.lastUpdated=1741856946183 https\://repos.iec.io/repository/maven-caf/.error= https\://repos.iec.io/repository/maven-trial/.error= https\://repos.iec.io/repository/maven-zzy-snapshots/.lastUpdated=1741856946213 https\://repos.iec.io/repository/maven-gsp/.error= https\://repos.iec.io/repository/maven-caf/.lastUpdated=1741856946152 https\://repos.iec.io/repository/maven-trial/.lastUpdated=1741856946079 https\://repos.iec.io/repository/maven-gsp/.lastUpdated=1741856946117 http\://maven.aliyun.com/nexus/content/repositories/central/.error= http\://maven.aliyun.com/nexus/content/repositories/central/.lastUpdated=1741856946329 https\://repos.iec.io/repository/maven-zzy/.error= https\://repos.iec.io/repository/maven-zzy-snapshots/.error= #NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice. #Thu Mar 13 17:09:07 CST 2025 https\://repos.iec.io/repository/maven-zzy/.lastUpdated=1741856946916 https\://repos.iec.io/repository/maven-caf/.error= https\://repos.iec.io/repository/maven-trial/.error= https\://repos.iec.io/repository/maven-zzy-snapshots/.lastUpdated=1741856946958 https\://repos.iec.io/repository/maven-gsp/.error= https\://repos.iec.io/repository/maven-caf/.lastUpdated=1741856946884 https\://repos.iec.io/repository/maven-trial/.lastUpdated=1741856946800 https\://repos.iec.io/repository/maven-gsp/.lastUpdated=1741856946850 http\://maven.aliyun.com/nexus/content/repositories/central/.error= http\://maven.aliyun.com/nexus/content/repositories/central/.lastUpdated=1741856947058 https\://repos.iec.io/repository/maven-zzy/.error= https\://repos.iec.io/repository/maven-zzy-snapshots/.error=
最新发布
03-14
<think>嗯,用户给了一个看起来像是Maven的某种内部文件的内容,并且希望我解释一下这是什么。首先,我需要回忆一下Maven的工作原理。Maven在构建项目时会下载依赖,这些依赖通常存放在远程仓库中。当下载依赖时,Maven会在本地仓库中保存一些元数据,比如.lastUpdated文件,用来记录上次检查更新的时间,避免频繁请求远程仓库。此外,如果下载失败,可能会有.error文件记录错误信息。 看用户提供的文件内容,里面有很多以仓库URL开头的条目,每个条目后面跟着.lastUpdated=时间戳或者.error=。同时,文件头尾有注释说明这是Maven Resolver的内部实现文件,格式可能随时变化。这说明这个文件是Maven用来跟踪各个远程仓库状态和最后更新时间戳的。 用户可能是在本地仓库的某个目录下发现了这些文件,或者是在构建过程中遇到了问题,比如依赖下载失败,想了解这些文件的用途。需要解释这些文件的作用,为什么会有.error和.lastUpdated,以及它们对Maven构建过程的影响。 另外,用户提供的文件中时间戳都是2025年的,这可能是因为示例中的时间被修改过,或者系统时间设置有误。不过这可能不是用户关注的重点,重点在于文件的结构和用途。 需要分步骤解释:首先说明文件的作用,然后逐项分析条目,比如.error表示最近一次请求该仓库是否出错,.lastUpdated记录最后检查时间。同时提醒用户这些是内部文件,不建议手动修改,以免引发问题。可能还需要提到如何根据这些文件诊断网络问题或仓库不可用的情况,比如查看.error文件是否存在,时间戳是否过旧导致Maven重新尝试下载等。 此外,用户可能想知道如何处理这些文件。例如,有时候删除这些文件可以强制Maven重新尝试下载依赖,尤其是在遇到仓库连接问题时。但需要谨慎操作,避免破坏本地仓库的其他部分。 最后,总结文件的重要性,并建议用户在遇到构建问题时检查这些文件的状态,但不要手动编辑它们,而是通过Maven命令如mvn clean install -U来强制更新快照依赖。</think>这是一个**Maven本地仓库的更新状态记录文件**,属于Maven依赖解析器(Resolver)内部实现的一部分。以下是对其结构和作用的逐步解析: --- ### 一、文件作用 1. **核心功能**:记录Maven与远程仓库的交互状态 - `.lastUpdated`后缀:记录最后一次成功连接该仓库的时间戳 - `.error`后缀:标记该仓库最近一次请求是否出现错误 2. **核心目的**:优化依赖解析效率 - 避免重复检查未更新的仓库 - 快速跳过已知存在问题的仓库 --- ### 二、文件结构解析 以典型条目为例: ```properties https\://repos.iec.io/repository/maven-zzy/.lastUpdated=1741856946183 https\://repos.iec.io/repository/maven-caf/.error= ``` 1. **URL编码**:冒号被义为`\:` - 保持URI格式有效性 2. **时间戳格式**:Unix毫秒时间戳 - 示例值`1741856946183`对应北京时间 2025-03-13 17:09:06.183 3. **空值标记**:`.error=`空值表示最近一次请求失败 --- ### 三、关键特征说明 | 特征项 | 技术细节 | |---------|----------| | 更新策略 | 基于`<updatePolicy>`配置(默认daily)| | 时间戳作用 | 计算`Last-Modified`与远程仓库校验 | | 错误标记 | 触发后会暂时跳过该仓库的请求 | | 文件位置 | 本地仓库的`${repository}/.meta/`目录 | --- ### 四、开发者注意事项 1. **不要手动修改**:可能导致Resolver状态异常 2. **强制更新方法**: ```bash mvn clean install -U # 强制更新SNAPSHOT ``` 3. **清理缓存**:删除`.lastUpdated`文件后Maven会重新校验 ```bash find ~/.m2 -name "_remote.repositories" -delete ``` --- ### 五、时间戳换示例 对条目`1741856946183`的解析: ```javascript // 在浏览器控制台执行 new Date(1741856946183).toLocaleString() // 输出:"2025/3/13 17:09:06" (CST) ``` 这个文件是Maven实现离线优先策略的关键机制,建议开发者通过标准Maven命令操作而非直接修改文件内容。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值