`
baodaqin
  • 浏览: 9958 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

hibernate如何实现多个表结构相同的表对应同一个实体类

阅读更多

关于hibernate的使用这里就不多说了,

我们都知道在使用hibernate提供的框架时,我们只需要写好相关配置文件,对应好映射关系,在代码中运用好SQL语句就可以很好地与数据库进行交互,往往我们都是在数据已经建好的基础上进行一系列操作的,但是我们也可以在xml文件中配置

<property name="hibernate.hbm2ddl.auto">
   update
 </property>

即使在数据库中没有此表最终也会自动生成一个表,但是这个表名在配置时就已经被确定了,即使在运用的时候也必须使用该表名,一般情况确实是这样的。

现在有这样一个需求,根据传递的参数可以动态生成一张表,表名即为传递的参数,目前这个建表过程我使用了一个最原始的方法
public String createTable(){
  try {
   HttpServletRequest request = ServletActionContext.getRequest();
   String name = request.getParameter("name");
   Session session = HibernateSessionFactory.getSession();
   Connection con = (Connection) HibernateSessionFactory.getConnection();
   Statement stmt = (Statement) con.createStatement();

   //判断数据库中是否已经存在这个表

   ResultSet tabs = null;
   DatabaseMetaData dbMetaData = conn.getMetaData();
   String[]   types   =   { "TABLE" };
   tabs = dbMetaData.getTables(null, null, name, types);
   if (tabs.next()) {
      stmt.execute("create table "+name+"(id int primary key,username varchar(45),password varchar(45))");
   }
  } catch (Exception e) {
   e.printStackTrace();
  }finally{
   HibernateSessionFactory.closeSession();
  }
  return SUCCESS;
 }

其中HibernateSessionFactory是一个自己写的工厂类,用于创建session对象;

下面就要使用hibernate进行数据库操作了,一般来说当我们创建了session对象,调用save(),update()等方法或者使用SQL语句得到Query对象,在这操作执行之后,他们都会向数据库发送一段sql语句,我们要做的就是在数据库执行这条语句之前改造这条语句,此时我们可以使用hibernate的的拦截器 EmptyInterceptor

我们写一个类只要继承这个类,重写@Override
 public String onPrepareStatement(String sql) {
  return sql;
 }

这个方法,其中方法内的参数就是要发送给数据库的sql语句,我们只需要分析这个语句将其中的table名替换掉就可以了,至于具体规则可以将自己想项目中可能出现的sql语句打印出来分析替换即可

例如对于一个普通的查询语句"select * from table"

String newSQL = "";
 String str = "select * from table";
  String[] from = str.split(" ");
  boolean flag = false;
  for (int i = 0; i < from.length; i++) {
   if("from".equalsIgnoreCase(from[i])){
    newSQL += from[i]+" ";
    from[i+1] = tableName;
    newSQL += from[i+1]+" ";
    flag = true;
   }else{
    if(flag){
     flag = false;
     continue;
    }
    newSQL += from[i]+" ";
   }
  }

tableName为需要替换的表名

最后在使用的时候我们通过SessionFactory.openSession(Interceptor arg0)方法将拦截器作为参数获得session对象,接下来的操作就大体相似了

 

分享到:
评论

相关推荐

    hibernate生成实体类

    在实际开发过程中,很多时候我们希望能够快速地根据已有的数据库表结构自动生成相应的实体类,从而减少手动编码的工作量并提高开发效率。下面将详细介绍如何利用MyEclipse集成开发环境结合Hibernate工具来实现这一...

    hibernate动态生成表结构

    2. 创建实体类:这些类代表数据库中的表,每个类对应一个表,类的属性对应表的字段。 3. 映射文件(`.hbm.xml`)或注解:为实体类定义映射规则,告诉Hibernate如何将类与表关联。 三、动态生成表结构 Hibernate...

    hibernate多表联合查询

    在实际项目开发中,我们经常需要处理复杂的数据库查询,特别是涉及到多个表之间的关联查询。Hibernate作为一款流行的Java持久层框架,提供了一种非常便捷的方式来处理这些问题。本文将详细介绍如何利用Hibernate进行...

    Hibernate 单表实现树结构

    在实现树结构时,我们需要定义一个实体类,该类代表树中的一个节点,比如一个部门或者一个目录。实体类中会有两个关键属性:一个是标识当前节点的ID,另一个是引用父节点的ID。这样的设计使得单个表能够表示层次关系...

    Hibernate 多表连接分页查询示范项目

    在 "mhouse" 这个示例项目中,可能包含了一个房地产相关的数据库模型,涉及多个表,比如房屋信息表、房主信息表等。项目通过 Hibernate Criteria API 展示了如何进行多表连接查询,并结合分页功能,有效地获取和展示...

    Hibernate实体类生成器mysql版

    而实体类则是Hibernate中连接数据库表的重要桥梁,它代表了数据库中的一个表,通过注解或者XML配置文件,将类的属性与表的字段一一对应。 "Hibernate实体类生成器mysql版"正是针对这个需求应运而生。它支持多表生成...

    hibernate 映射关系学习入门 多对多实体映射

    在关系数据库中,多对多关系是指两个表之间存在多个对应关系。例如,学生可以选修多门课程,而课程也可以被多名学生选修。在Hibernate中,多对多关系通过中间表(也称为联接表或关联表)来实现,这个表包含来自两个...

    生成实体类 hibernate

    在Hibernate中,一个实体类通常对应数据库中的一张表,类的属性对应表的列,而对象实例则对应表的行。通过定义实体类,我们可以用Java代码来操作数据库,无需编写大量的SQL语句。 要生成实体类,我们需要先配置...

    hibernate实体生成工具

    在Hibernate中,实体类代表数据库中的表,每个实体类对应一个表,类的属性对应表的列。实体类通常会使用`@Entity`注解来标记,并通过`@Table`注解指定对应的数据库表名。实体类的属性使用`@Column`注解来映射表的列...

    oracle 表转实体类工具

    "Oracle表转实体类工具"是一种实用的开发辅助软件,它能自动化地将Oracle数据库中的表结构转换为Java实体类代码,极大地提高了开发效率。这个工具能够自动分析表的字段、数据类型,并生成对应的Java属性,同时还能...

    hibernate映射继承关系(每个类都对应一张表)

    1. **配置实体类**:首先,你需要为每个类创建一个Java实体类,并使用`@Entity`注解标记它们。对于基类,可以使用`@Inheritance(strategy=InheritanceType.SINGLE_TABLE)`来指定继承类型,但在这个情况下,不需要...

    Hibernate基于连接表的一对多单向关联

    在数据库设计中,一对多关联是指一个表中的记录可以对应另一个表中的多个记录,例如,一个部门可以有多个员工。在这个场景中,我们将探讨如何使用Hibernate来实现这种关系。 首先,我们来看“连接表”的概念。在一...

    hibernate注册功能的实现

    2. 数据库表结构:根据实体类设计数据库表,确保与实体类属性相对应。对于时间字段,数据库表中应有一个日期或时间类型列,如`CREATE_DATE`。 3. Hibernate配置:在Hibernate配置文件中,定义实体类与数据库表之间...

    Hibernate实体层设计

    每个实体类的属性都对应着数据库表中的列。使用注解如@Column,@GeneratedValue等可以指定属性与数据库列的对应关系。例如,上述User类中的id字段,可以通过@GeneratedValue指定自增长策略: ```java @Id @...

    Hibernate继承映射二:每个子类一张表

    总结来说,“每个子类一张表”的继承映射策略是Hibernate提供的一种处理继承关系的方法,它将类的继承结构映射到数据库的多个表中。这种策略适合于子类具有大量特有属性的情况,但需要权衡可能带来的数据库设计复杂...

    Hibernate实体映射

    每个Java实体类通常代表数据库中的一个表,实体类的实例则对应表中的记录。这种映射通过Hibernate的配置文件(通常是hibernate.cfg.xml)和注解(或.hbm.xml文件)来定义。 二、实体类与注解 在Java类上使用特定的...

    hibernate对应关系详解

    单表继承所有子类数据存储在一个表中,联合继承每个子类对应一个表,而歧视值继承则是用一个字段区分不同子类。 7. **懒加载和立即加载**:Hibernate提供了懒加载和立即加载策略,懒加载延迟加载关联的对象,直到...

    hibernate中创建表

    1. **创建实体类**:在Java中,定义一个实体类,比如`User.java`,并使用`@Entity`注解标记这个类为Hibernate管理的实体。例如: ```java import javax.persistence.Entity; import javax.persistence....

    java模拟hibernate实现

    模拟Hibernate时,需要实现事务管理,例如使用try-catch-finally结构来包围多个数据库操作,确保在出现异常时能正确回滚事务。 8. **EasyDB**: 这可能是项目中的一个模块或工具,可能是一个简化版的数据库操作库,...

    Hibernate一对一,一对多,多对多实例

    一对多关联常出现在一个实体可以对应多个其他实体的情况,如一个班级有多个学生。在Hibernate中,可以通过在一方实体的属性上使用`@OneToMany`注解,而在多方实体上使用`@ManyToOne`注解来定义这种关系。例如,...

Global site tag (gtag.js) - Google Analytics