4.2的ORM有个问题,不知道不知道是不是BUG

Aug 7, 2015
Hibernate ORM 4.2.20.Final was released 24-July-2015. At the time it was released,
SourceForge was out of commission so distributions could not be uploaded. I decided
to delay the announcement until SourceForge was back in commission and I was able
to release 4.3.11.Final on 5-Aug-2015.
Release Notes
4.2.20.Final:
4.3.11.Final:
Notable bugfixes
In both 4.3.11.Final and 4.2.20.Final:
fixed a longstanding bug
affecting dialects that require the type for binding null parameter values to a query
predicate like (:param IS NULL OR alias.someField = :param). This bug affected Oracle
and SQL Server dialects, and possibly others. This bug was easily worked around, but
it was clearly a headache for people using those dialects.
In 4.3.11.Final only:
fixed a bug that caused
pooled optimizer identifiers to be reused if an external (to Hibernate) system inserted
a row using the same sequence.
Hibernate’s support for AttributeConverter was improved.
adds support for a parameterized type as an AttributeConverter type parameter
(e.g., AttributeConverter&Set&Category&, String&);
fixed a bug extracting
the ParameterizedType representation of AttributeConverter definition from an
implementation that did not directly implement AttributeConverter
i.e., a superclass implements AttributeConverter.
There were some bugfixes related to lazy (byte-code instrumented) properties.
fixed a longstanding
bug merging a detached entity with a lazy property that has been initialized
(this only works for "property" access);
fixed a bug processing
lazy properties after an EntityManager PreU
fixed a bug in cache
key generation for an entity with inheritance when fetching lazy property.
How to get it
Release tag for 4.2.20.Final:
Release tag for 4.3.11.Final:
for information on obtaining the releases.
Please enable JavaScript to view the下次自动登录
现在的位置:
& 综合 & 正文
Hibernate4与hibernate3主要区别与版本不一致导致的错误
Hibernate版本改动
Hibernate4的改动较大只有spring3.1以上版本能够支持,Spring3.1取消了HibernateTemplate,因为Hibernate4的事务管理已经很好了,不用Spring再扩展了。这里简单介绍了hibernate4相对于hibernate3配置时出现的错误,只列举了问题和解决方法
Spring3.1去掉了HibernateDaoSupport类。hibernate4需要通过getCurrentSession()获取session。并且设置&prop key="hibernate.current_session_context_class"&org.springframework.orm.hibernate4.SpringSessionContext&/prop&(在hibernate3的时候是thread和jta)。
缓存设置改为&prop key=" hibernate.cache.provider_class"&net.sf.ehcache.hibernate.EhCacheProvider&/prop&
&prop key="hiber nate.cache.region.factory_class"&org.hibernate.cache.ehcache.EhCacheRegionFactory&/prop&
Spring对hibernate的事务管理,不论是注解方式还是配置文件方式统一改为:&bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager" &
&property name="sessionFactory"&&ref bean="sessionFactory"/&&/property& &/bean&
getCurrentSession()事务会自动关闭,所以在有所jsp页面查询数据都会关闭session。要想在jsp查询数据库需要加入:org.springframework.orm.hibernate4.support.OpenSessionInViewFilter过滤器。
Hibernate分页出现 ResultSet may only be accessed in a forward direction 需要设置hibernate结果集滚动 &prop key="jdbc.use_scrollable_resultset"&false&/prop&
--------------------------------------------------------------------
找到篇好文章,我之前遇到的问题都在这都能找到。其实出现这些问题的关键就是hibernate4和hibernate3出现了session管理的变动。
spring也作出相应的变动....
错 误 1:java.lang.NoClassDefFoundError: org/hibernate/cache/CacheProvider
原因:spring的sessionfactory和transactionmanager与支持hibernate3时不同。
&bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"&
&property name="dataSource" ref="dataSource"/&
&bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"&
&property name="sessionFactory" ref="sessionFactory"/&
错 误 2:java.lang.NoSuchMethodError:org.hibernate.SessionFactory.openSession()Lorg/hibernate/classic/Session
原因:hibernate4之后,spring31把HibernateDaoSupport去除,包括数据访问都不需要hibernatetemplate,这意味着dao需要改写,直接使用hibernate的session和query接口。
解决:为了改写dao,足足花了一天时间,然后一个个接口进行单元测试,这是蛋疼的一个主要原因。
错 误 3:nested exception is org.hibernate.HibernateException: No Session found for current thread
原因:发现一些bean无法获得当前session,需要把之前一些方法的事务从NOT_SUPPORT提升到required,readonly=true
见https://jira.springsource.org/browse/SPR-9020, /topic/1120924
&tx:advice id="baseServiceAdvice" transaction-manager="transactionManager"&
&tx:attributes&
&tx:method name="get*" read-only="true" propagation="REQUIRED"/&&!--之前是NOT_SUPPORT--&
&tx:method name="find*" read-only="true" propagation="REQUIRED"/&&!--之前是NOT_SUPPORT--&
&tx:method name="save*" propagation="REQUIRED"/&
&tx:method name="update*" propagation="REQUIRED"/&
&tx:method name="remove*" propagation="REQUIRED"/&
&tx:method name="add*" propagation="REQUIRED"/&
&!--默认其他方法都是REQUIRED--&
&tx:method name="*"/&
&/tx:attributes&
&/tx:advice&
错 误 4 :与错误 3报 错类似,java.lang.NoSuchMethodError:org.hibernate.SessionFactory.openSession()Lorg/hibernate/classic/S
at org.springframework.orm.hibernate3.SessionFactoryUtils.doGetSession(SessionFactoryUtils.java:324) [spring-orm-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at org.springframework.orm.hibernate3.SessionFactoryUtils.getSession(SessionFactoryUtils.java:202) [spring-orm-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
原因:因为opensessioninview filter的问题,如果你的配置还是hibernate3,需要改为hibernate4
&filter-name&openSessionInViewFilter&/filter-name&
&filter-class&org.springframework.orm.hibernate4.support.OpenSessionInViewFilter&/filter-class&
由于Hibernate4已经完全可以实现事fds务了, 与Spring3.1中的hibernatedao,hibernateTemplete等充突,所以Spring3.1里已经不提供Hibernatedaosupport,HibernateTemplete了,只能用Hibernate原始的方式用session:
Session session = sessionFactory.openSession();
Session session = sessionFactory.getCurrentSession();
在Basedao里可以用注入的sessionFactory获取session.
注意, 配置事务的时候必须将父类BaseServiceImpl也配上,要不然会出现错误:
No Session found for currentthread, 以前是不需要的
SessionFactory.getCurrentSession()的后台实现是可拔插的。因此,引入了新的扩展接口 (org.hibernate.context.spi.CurrentSessionContext)和
新的配置参数(hibernate.current_session_context_class),以便对什么是“当前session”的范围和上下文(scope and context)的定义进行拔##插。
在Spring @Transactional声明式事务管理,”currentSession”的定义为: 当前被 Spring事务管理器 管理的Session,此时应配置:
hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext。
此处一定注意 使用 hibernate4,在不使用OpenSessionInView模式时,在使用getCurrentSession()时会有如下问题: 当有一个方法list 传播行为为Supports,当在另一个方法getPage()(无事务)调用list方法时会抛出org.hibernate.HibernateException: No Session found for current thread 异常。 这是因为getCurrentSession()在没有session的情况下不会自动创建一个,不知道这是不是Spring3.1实现的bug。 因此最好的解决方案是使用REQUIRED的传播行为。
&&&&推荐文章:
【上篇】【下篇】赞助商链接
这是来自Pere Villega的一篇博文,主要从EventSourcing角度谈其对ORM的可替代性。阻抗不匹配性大部分信息系统都是持久化存储信息然后查询获取,这大部分是通过RDBMS完成的,不久NOSQL运动促使其成为一个关系数据库的替代者,总得来说,我们需要一个存储区域来保存数据。但是,这不代表没有问题,流行的开发模型是基于面向对象编程语言配以关系数据库,这种组合有致命的问题:对象和关系阻抗不匹配性,换句话说,他们并不能在一起工作得很好,这其中有许多原因。这不是一个新问题,人们也在艰难努力提供新的解决方案以消除痛苦,从一个开发者角度看,ORM可能缓解一下这种不匹配问题,即使只是稍微低,像Hibernate这样的工具负责与关系数据库层打交道,这样开发者不必花费时间在这上面,但是这并不完美,由于使得问题变得棘手,任何使用过Hibernate的人都发现通过其框架实现的查询都不够完美,那就意味着开发者必须钻研得很深以便知晓如何告诉框架让它按自己的意图行事,这也通常意味着你进入了底层低级别,包括数据库层,阻抗不匹配问题又冒出来了。这样,ORM作为一个完整的解决方案失败了,但是这是一个严重的问题,因为我们开发者已经为之付出了很多努力,在Scala的关系数据库列表中,我发现有6个不同的工具提供Scala和持久层之间的通讯联系,我们只是讲一种语言,还没有谈到Python或Java等类似名单,也不包括很多自己开发的内部ORM系统,他们是好的工具,是可以产品化规模使用的。现在我们每年有多少人时投入其中呢?即使我们开发者全部迁移到函数范式,Java 8的发布已经确认,即使NoSQL成为一个可行的候选方案,我们可以消灭了阻抗不匹配,但是换还要使用转换层来与关系数据库通讯,还需要转换我们的数据对象格式以便它们适合存储,你认为作为一个文档型的数据库MongoDB可以解决这个问题,如下:query = new BasicDBObject("i",
new BasicDBObject("$gt", 20).
append("$lte", 30)); cursor = coll.find(query);错误的方向?如果我们花费这么多人时在这个问题上,它还会引起头痛,也许是我们的方向错了?在应用中每个新组件都会增加系统的复杂性,这是一个好的复杂性,比如微服务,给你一个清晰的优势,即使增加了部件的数目,也有坏的复杂性,得学习像Hibernate这样一个完整的框架,这对于只是想将我的数据保存起来来说是过分了点。一个服务管理应用状态的存储是正确方向,但是当你在应用中有领域对象,其包含的数据和需要保存的数据有着完全不同的模型时,这就浪费时间了。诚实讲,我们很多人这么做,这是很自然,以至于未觉察没有什么不对,直至正确的方式出现,就是这样在正确方向出现的一个工具。当然,我们不能欺骗自己,它也是一个必须学习的框架,它很可能一旦投入苛刻的生产环境,原先所有的承诺将会失败,但是请看看下面论述:Akka持久框架提供了一个Event Sourcing模式的实现,可以忘记存储层阻抗不匹配,你的源码就是你的领域对象,你将变化存储到这些领域对象中,你能复制系统的任何时刻的状态,通过关注新的状态,不会有事务性问题出现(不修改原来的数据,永远只是新增数据,就没有多线程争夺,也就不需要全局事务JTA或数据库锁等),因为在数据层不再有对旧数据的修改发生,你能够任意截获随时间变化的状态序列,而关系数据库只能保存最后时刻的最后状态。为什么要浪费时间在ORM或其他的选择吗?持久性一下子就变成了支撑系统,而不是你应用程序的主要组成部分之一。数据都驻留在你的领域中。你的领域对象是业务真相的源泉,而只有在确保它们的状态不会丢失的情况下,你才会将它们从内存中移除。这是很简单的。为什么它会成功?正如我所说的,有可能是我还没有考虑到技术问题。我可能无论是在用例或性能上存在盲目乐观的问题。也可能是因为它仅使用该存储系统来构建一个解决方案是不可行的。我可能是错误的。Akka持久框架有可能比目前的ORM在性能上轻微的差些,但是我不怀疑Typesafe有一批聪明的工程师会持续解决这些问题。这坚信必定会成功的理由是:简单是王牌,看看这几年流行的技术:MySQL PHP Ruby
MongoDb,它们都不是性能最优的,但是有短处,但是它们还是流行了,有很多开发应用,为什么?简单,如果这些技术有一个共同特点就是易于使用,任何开发者只要花几个小时学习基础就能使用它们。下面是持久层了,请忘记学习SQL, 事务上下文 或ORM等复杂的技术,你的领域对象就是你的数据,这将成为大规模主流,增加软件的产品性,能够去除因为使用ORM导致的大量BUG和带来的扩展性问题,同时,你有一个简单且性能不错的框架。我但愿我是错的...翻译完:相关参考:
标题太惊悚了,世界上就没有绝对的,在能像hibernate有大量成熟的大规模应用之前是不会消失了。持久化优雅的目标应该是能“像访问内存集合一样访问数据库”,ORM、EventSourcing手段而已关系数据库或非关系型数据库都最终归于对象集合!描述领域实体关系就剩Collection等基本数据类型了,也就谈不上“抽象泄露”.net 代码部分片断
public ICollection<T> CreateCollection<T>()
return CreateCollection<T>(id => { });
public ICollection<T> CreateCollection<T>(Action<object> callback)
var items = new ObservableCollection<T>();
var changes = Observable.FromEventPattern(
(EventHandler<NotifyCollectionChangedEventArgs> ev)
=> new NotifyCollectionChangedEventHandler(ev),
ev => items.CollectionChanged += ev,
ev => items.CollectionChanged -= ev);
var adds =
from c in changes
where c.EventArgs.Action == NotifyCollectionChangedAction.Add
from item in c.EventArgs.NewItems.Cast<T>().ToObservable()
var removes =
from c in changes
where c.EventArgs.Action == NotifyCollectionChangedAction.Remove
from item in c.EventArgs.OldItems.Cast<T>().ToObservable()
adds.Subscribe(item =>
object id = Session.Save(item);
if (id != null)
callback(id);
removes.Subscribe(item =>
Session.Delete(item);
callback(true);
callback(false);
}查询接口(你懂的),剩下就是linq去解决问题了。
public interface IQuery<TResult> where TResult : class
IQueryable<TResult> Execute();
IQueryable<TResult> Execute(int timeout);
IQueryable<TResult> Execute(IDictionary parameters);
IQueryable<TResult> Execute(IDictionary parameters, int timeout);
}自己动手丰衣足食,简单封装以下,其实思想都是一致的[该贴被clonalman于 23:11修改过]
这篇文章主要是讲如何存储数据,而不是如何查询数据,查询数据方面使用LinQ或Java8的Stream已经做得不错:。过去我们存储数据到关系数据库或NoSQL,存储的是应用程序的当前状态,至于如何导致状态变化到当前这个值的原因没有存储。根据状态模式总结,导致状态变化的一般是事件,存储事件是EventSourcing的主要特点。存储事件总是存储的是一个个新的事件,比如你如果要修改删除一个已经存在的数据,如果按照存储状态的思路,那就先从数据库找到要删除的记录,然后修改它或删除,而按照EventSourcing思维,你必须发出一个新的修改或删除事件,Akka持久框架应该能存储这个修改或删除事件,这个新事件发出后,导致内存中领域模型实体内状态发生变化,比如一个论坛Forum实体内部状态原来是20个帖子的状态,你发出删除一个帖子新事件后,其状态变成19个帖子。至于数据库存储的是删除事件,而不是19这个状态。如果机器重启,系统会根据存储的历史事件流进行重新播放,像放电影一样,一直放到关机前的状态,也就是19个帖子这个状态,但是19这个数据永远不会存储到数据库中了。
07:36 "@banq"的内容一个论坛Forum实体内部状态原来是20个帖子的状态,你发出删除一个帖子新事件后,其状态变成19个帖子。至于数据库存储的是删除事件,而不是19这个状态。 ... 知道是关于如何存储数据,是不是可以换一种描述方式:Forum实体内部状态原来是20个帖子,是一个Collection,从Collection中删掉一个帖子剩下19个帖子。(幼儿园题目,这样表述是不是更加清爽)存储的是删除事件还是对象实体本身,对于对象集合来说透明的,上面的例子ICollection&Entity&是hibernate的session的save与delete直接影射到Collection的Add与Remove方法上,EventSourcing同理只要添加事件、删除事件影射到集合操作方法即可。
一台服务器的内存是有限的,不可能把整个业务系统的操作都进行重放,即使可以重放也不能模拟事件发生时的硬件、网络和第三方系统的状态。我们把领域对象序列化成XML,然后整个存进MSSQL也是没问题的,XPATH查询也很方便。NOSQL号称能存放无模式数据,传统的关系型数据库也能做到。
赞助商链接
赞助商链接
最佳分辨率
OpenSource
Code & 2002-20ORM一键还原系统下载|ORM一键还原备份系统4.1.39.1 官方免费版 - 绿色软件下载 - JZ5U绿色下载站
您当前的位置: -&
本类下载榜
总下载排行
ORM一键还原备份系统4.1.39.1 官方免费版
软件大小:11.97 MB
软件类型:特别软件 - 系统工具 - 备份工具
软件标签:
软件语言:简体中文
授权方式:免费软件
软件星级:
更新时间: 16:51:44
运行环境:WinXP/Win2003/Vista/Win7/Win8/WinALL
下载帮助: 解压密码:
ORM一键还原系统是一款功能强大的Windows系统备份和还原工具,ORM一键还原系统其备份速度比GHOST更快,而且压缩率更为出色!ORM一键还原系统体积小巧,但是功能非常强悍,可以全自动备份系统数据到最大分区,ORM一键还原系统同时支持所有主流Windows系统以及包括EFI/GPT硬盘在内的各种新旧硬件!即使您没有专业的计算机知识,一键还原系统也可以帮你轻松备份和还原系统
经用户测试,它的备份速度是GHOST的两倍,生成的备份文件更小。
安装文件只有10M,秒杀市面上所有同类软件。
备份时,全自动查找当前硬盘,当发现剩余空间最大的分区时,就会把系统备份到这个分区里。
如果您使用的是Windows Vista及以上的操作系统,它会帮您备份启动分区和系统分区,保证系统数据不丢失。
支持Win2000及Win2000之后的任何Windows系统,不论是32位还是64位
支持传统的BIOS主板和新式的EFI主板,支持传统的BIOS分区和GPT分区
紧跟Linux稳定版内核,保证升级频率,不惧怕市面上的任何新硬件
安装完成后,您可以从安装目录提取ORM.iso文件,制作成可从主板启动的CD或U盘
不包含任何的流氓软件或恶意代码
所有代码均采用开源软件修改和编译
1. 使用方便:全程傻瓜式操作,轻松备份与还原
2. 速度超快:备份速度比GHOST更快,压缩率更大
3. 体积小巧:安装文件不到9M,秒杀所有同类软件
4. 更加智能:全自动备份系统数据到最大分区
5. 兼容性好:支持所有主流Windows系统(32及64位)
6. 安全放心:支持各种新旧硬件(含EFI主板和GPT硬盘)
使用方法:
安装完成后,您可以从桌面双击&一键还原系统&,然后您就看到了下图所示的界面
如果您要立刻备份或还原,可以点击&立即重启&,来重启电脑,并进入备份和还原界面
如果您还要进行其他工作,例如处理Word文档,那么请不要选择&是&,否则您将丢失您正在编辑的内容
重启电脑后,您将看到如下图所示的选择界面(不同操作系统看到的选择界面略有不同)
请您在这时按键盘上的方向键(&&)选择&一键还原系统&,然后按回车(Enter)键,之后您将看到如下的界面
直接点击回车,就会开始自动备份系统,如下图所示
备份完成后,会提示您重启电脑
- 修正一键重装功能失效的问题
- 新增一键重装系统功能
- 修正启动分区过大时,只备份启动分区的Bug
- 内核升级到3.19.5,提升稳定性
~内核升级到3.18.10,提升稳定性
最近改进:
&发布了独立的光盘版,使用更便捷
&NTFS分区有错误时,自动尝试修复
&GPT硬盘备份时,自动跳过微软恢复分区
&修正了部分电脑只备份启动分区的BUG
&修正从任务栏关闭时进程残留的问题
&修正了Win8及以上系统反复重启的问题
&修正了一些与EFI有关的Bug
&修复了无法在FAT分区上存储超大备份文件的问题
&解决EFI主板插着U盘开机时显示错误信息的问题
&解决部分USB无线键盘无法进行手工备份还原的问题
ORM一键还原系统 V3.18.7
- 不再备份GPT硬盘的微软恢复分区
- 修正GPT硬盘存在微软恢复分区时,只备份一个分区的BUG
最近改进:
&发布了独立的光盘版,使用更便捷
&NTFS分区有错误时,自动尝试修复
&GPT硬盘备份时,自动跳过微软恢复分区
&修正了部分电脑只备份启动分区的BUG
&修正从任务栏关闭时进程残留的问题
&修正了Win8及以上系统反复重启的问题
&修正了一些与EFI有关的Bug
&修复了无法在FAT分区上存储超大备份文件的问题
&解决EFI主板插着U盘开机时显示错误信息的问题
&解决部分USB无线键盘无法进行手工备份还原的问题
ORM一键还原系统 V3.18.2
修正了Win8及以上系统反复重启的问题
内核升级到3.18.2,提升稳定性
上一软件:
下一软件:
* 本站提供的软件我们都会尽可能测试再上传,都亲自运行过,同时通过360等杀毒软件的验证,限于能力及系统等问题,无法保证所有软件都没有任何问题,如果您发现链接错误或其它问题,发email到zarong◎告诉我们,谢谢!
* 为了达到最快的下载速度,推荐使用或下载本站软件。为确保正常使用请用最新版来解压本站提供的软件!
* 为了网站可以继续发展下去,在不太影响大家的情况下还请给予点击站内广告。本站所有下载无需点击任何广告即可正常下载,由于部分是FTP下载,限制了同时连接数,因此还请使用下载工具尝试多一会连接时间。如果您发现下载链接错误,请点击谢谢!
* 站内提供的所有软件如包含破解及注册码均是由网上搜集,若无意中侵犯到您的版权利益,通知我们,我们会在收到信息一周内给予配合处理!
* 本站为非营利性站点,所有资源均是网上搜集或私下交流学习之用,任何涉及商业盈利目的均不得使用,否则产生的一切后果将由您自己承担!本站仅仅提供一个观摩学习的环境,将不对任何资源负法律责任。所有资源请在下载后24小时内删除。如果您觉得满意,请购买正版,唯有如此才能更好支持你所喜欢的软件更好发展!本站严厉谴责和鄙夷一切利用本站资源进行牟利的盗版行为!Posts - 40,
Articles - 0,
Comments - 230
09:57 by bugfly, ... 阅读,
&& 恩,这个标题是当时我不懂ORM在百度上冒出来的第一个搜索念头,然而我当时一直没尝试认真去了解这个听了不少次的名词。还是那句吧,带着疑问,去研究一样东西才能体会这个过程的所得。
&&&废话了那么多,其实这篇博只是为了告诉你WHY,具体的HOW就没有例子了。
&& 到底为什么要ORM呢?我觉得ORM是一个从WEB上诞生的东西,理解它其实很简单,想想,你在利用三层架构开发的时候,要为相应的表写对应的实体数据类,当只有几个表的时候,当然不觉得这是一种负担,试试极限化所面对的问题,你的数据库有100个表,这时意味着你要写100个对应这些表的实体数据类,数量庞大可想而知了,而这时ORM的出现可以解决这个问题,通过ORM框架,自动映射出对应的表对象,减少了不必要的操作,恩这就是ORM的其中一个好处,然而我觉得这个不是它最吸引人的地方,它最吸引人的地方是,隔离高级语言和结构化语言的耦合,所谓的高级语言可能是C#,VB,Java等,结构化语言一般是SQL。通过ORM,我们程序员可以直接对对象进行操作达到对数据库操作的目的,意味着你无需要了解SQL语言是怎么对数据库的访问了,可能你还是体现不到它的好处,我举个例子,现在你们的项目是使用SQL Server2005数据库的,那么你肯定要对SQL要有所了解吧?至少要会写存储过程,SQL语句什么的吧?但你的老板说他要改用Access,或者改用Oracle,甚至有可能是XML。。。数据源的基本结构是不变的,然而它的种类却变了,如果没有ORM,你要对这些不同的数据源的访问语法有所了解,要腾出时间去学习它们,有可能这些数据源访问方式你从来没接触过,但你却要去研究,因为要针对地修改实现方式满足项目要求,如果你还是没看懂它的好处,那么只能说你对自己太自信了,有时过于自信是一种没前瞻性的表现,好好理解以上的每句话。
&&&& 这里我把ORM的好处总结起来:
&&&&& 一、减轻程序员的工作负担。
&&&&& 二、把数据库技术的变化隔离出程序开发。
&以上是本人愚见,有什么观点错误,望能指点。}

我要回帖

更多关于 不知道自己是不是汉人 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信