当前位置:首页>开发>正文

hibernate到底能不能实现动态分表(动态表名) hibernate动态创建表

2023-06-19 09:03:34 互联网 未知 开发

 hibernate到底能不能实现动态分表(动态表名) hibernate动态创建表

hibernate到底能不能实现动态分表(动态表名)

我的需求是在数据库中相同表结构,不同表名的表有多个,然后在程序运行当中,读写合适的表,在网上查找资料发现了一个叫NamingStrategy的类,说是修改tableName方法,然而当我注入自己的NamingStrategy类运行后,发现只是在spring启动时执行了多次tableName方法,初始化资源,而在运行时就不再调该方法了,并没有实现我想要的效果,我现在很困惑,hibernate能不能实现动态表名,求指点方向问题补充:

hibernate动态创建表

你这种设计有问题啊。每注册一个会员创建一个表,重新加载hbm,是不是还要刷新一次sessionFactory?如果有人不停注册,那你的服务还跑不跑了?

你计算贡献值完全可以放在一个表中通过1对多或者HQL来过滤。

如果非要分表做,那就远离hbm,通过session.createSQLQuery()调用本地sql语句对数据库直接进行操作。

=================

理解错了,抱歉。这个可以结合你的数据库来看了。 我对pgsql比较熟, pgsql支持子表, 可以建立一个父表,然后每个月建立一个子表,查询的时候直接查询父表, pgsql会根据查询条件里的时间范围自动决定是在所有子表中查还是在特定子表中查。select * from 父表是可以检索到所有值的,这个机制在物理上又实现了数据水平切分和可管理性。

所以如果支持父-子表机制的数据库里,可以通过数据库本身的特性来实现,hbm不需要改变,映射到父表即可。insert时候会自动写入子表。如果子表不存在则写入父表。

如果在不支持父-子机制的数据库里,查询通过createSQLQuery来做,Hibernate支持将未映射的查询结果Transform为特定的类型的对象。例如:

query.setResultTransformer(Transformers.aliasToBean(MyObject.class))
query.list()

insert通过时间字段计算出要写入的数据表,通过insert来执行写入。

总之,我给出的意见就是,支持子表特性的数据库HBM来实现,不支持子表特性或者想脱离数据库依赖那就用SQL来实现。

Hibernate中怎么得到表名及字段名

用SQL语句显示数据库中所有表的名称: select 表名=name,类型=case xtype when S then 系统表 else 用户表 end from sysobjects where xtype in(U,S)

Spring、Hibernate怎么动态加载数据库、表

问题1中需要动态生成表与POJO的对应关系。
对每个pojo类建立一个映射文件,名称是简短类名.hbm.xml,存放位置与pojo类一致。

问题2中需要动态加载数据库。
在hibernate.cfg.xml中配置数据库连接信息和方言,设置自动建表语句。

hibernate能动态生成数据库表吗?

可以
如果你是单独使用hibernate的,请在hibernate.cfg.xml里面的sessionfactory下配置这个属性
如果你是使用SSH组合框架的,而且由SPRING管理sessionfactory的,请在applicationContext.xml里面配置
数据库方言 是否打印SQL 建表语句(参考值:validate | update | create | create-drop ,一般用update)

hibernate中@Entity和@Table的区别

参考http://www.cnblogs.com/softidea/p/6216722.html
Java Persistence API定义了一种定义,可以将常规的普通Java对象(有时被称作POJO)映射到数据库。
这些普通Java对象被称作Entity Bean。
除了是用Java Persistence元数据将其映射到数据库外,Entity Bean与其他Java类没有任何区别。
事实上,创建一个Entity Bean对象相当于新建一条记录,删除一个Entity Bean会同时从数据库中删除对应记录,修改一个Entity Bean时,容器会自动将Entity Bean的状态和数据库同步。
Java Persistence API还定义了一种查询语言(JPQL),具有与SQL相类似的特征,只不过做了裁减,以便处理Java对象而非原始的关系表。

hibernate中@Entity和@Table的区别:
@Entity说明这个class是实体类,并且使用默认的orm规则,即class名即数据库表中表名,class字段名即表中的字段名
如果想改变这种默认的orm规则,就要使用@Table来改变class名与数据库中表名的映射规则,@Column来改变class中字段名与db中表的字段名的映射规则

如何用hibernate查询不同数据库的表名

可以实现.
首先有一点要弄清楚!
一个hiernate一般只对应一个WEB应用和一个数据库
像你说的一个查询语句就办到,可能比较难
但是一个方法可能可以办到!
SessionFactory 的实例对应一个数据库
一个Hibernate.cfg.xml 配置文件对应一个数据库
你可以配置多个配置文件
获得SessionFactory实例的时候传入不同的配置文件即可

最新文章