问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

hibernate注解怎样自动生成

发布网友 发布时间:2022-04-08 05:02

我来回答

2个回答

懂视网 时间:2022-04-08 09:23

"tb_user") public class User { @Column("user_id") private int userId; @Column("user_name") private String userName; @Column("address") private String address; @Column("email") private String email; public int getUserId() { return userId; } public void setUserId(int userId) { this.userId = userId; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
package com.guoxinet.o2o.annotation;
@Table("tb_department")
public class DepartMent {
 @Column("department_id")
 private int departmentId;
 
 @Column("name")
 private String name;

 public int getDepartmentId() {
 return departmentId;
 }

 public void setDepartmentId(int departmentId) {
 this.departmentId = departmentId;
 }

 public String getName() {
 return name;
 }

 public void setName(String name) {
 this.name = name;
 }
 
 

}
package com.guoxinet.o2o.annotation;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Client {
 
 public static void main(String[] args) {
 User user = new User();
 user.setUserId(1);
 user.setEmail("3964412@qq.com,yafeng@yahu.com,lifeng@guoxinet.com");
 getSql(user);
 
 DepartMent dm = new DepartMent();
 dm.setDepartmentId(100);
 dm.setName("技术部");
 getSql(dm);
 }
 
 public static String getSql(Object ob){
 StringBuilder sb = new StringBuilder();
 //获取class
 @SuppressWarnings("rawtypes")
 Class c = ob.getClass();
 //获取table的名字
 @SuppressWarnings("unchecked")
 boolean isExist = c.isAnnotationPresent(Table.class);
 if(!isExist){
  return "";
 }
 Table table = (Table)c.getAnnotation(Table.class);
 
 String tableName = table.value();
 sb.append("select * from ").append(tableName).append(" where 1=1 ");
 //遍历属性
 Field[] fArray =c.getDeclaredFields();
 for(Field field: fArray){
  boolean fisExist = field.isAnnotationPresent(Column.class);
  if(!fisExist){
  continue;
  }
  Column column = (Column)field.getAnnotation(Column.class);
  //列名
  String columnName = column.value();
  //得到属性的值
  String methodName = "get" +field.getName().substring(0,1).toUpperCase() + field.getName().substring(1);
  Object fieldValue = null;
  try {
  Method method = c.getMethod(methodName);
  fieldValue = method.invoke(ob);
  if(null == fieldValue || (fieldValue instanceof Integer && 0 == (Integer)fieldValue) ){
   System.out.println(fieldValue);
   continue;
  }
  sb.append(" and ").append(columnName);
  if(fieldValue instanceof String){
   if(((String) fieldValue).contains(",")){
   String[] sArray = ((String) fieldValue).split(",");
   sb.append(" in ").append("(");
   for(String s : sArray){
    sb.append("‘").append(s).append("‘,");
   }
   sb.deleteCharAt(sb.length()-1);
   sb.append(")");
   }else{
   sb.append(" = ");
   sb.append("‘").append(fieldValue).append("‘");
   }
   
  }else{
   sb.append(" = ").append(fieldValue);
  }
  
  } catch (Exception e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  } 
 }
 sb.append(";");
 System.out.println(sb.toString());
 return null;
 }

}

 

注解学习实例(模拟hibernate,table,column注解,拼装SQL)

标签:

热心网友 时间:2022-04-08 06:31

按习惯来说,一般系统开发都是从数据库开始设计的。但从面向对象开发的角度,系统的设计应该基于对象模型的设计之上,主要考虑对象的设计和逻辑,然后按照对象模型生成数据库结构,利用hibernate的SchemaExport对象可以方便的实现这一点。另外,使用注解也省却了很多繁杂的配置工作,下面对hibernate注解自动生成数据表的过程做一个详细描述。
一、环境搭载
下载了最新的hibernate-release-4.0.0.CR7.zip,导入required包,这个例子是基于MySql数据库,因此还需要mysql-connector-java-5.1.5.jar
二、配置

hibernate的配置文件可以使用xml或者properties,这里使用的xml:

[html] view plain copy

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory>
<!-- 各属性的配置-->
<!--为true表示将Hibernate发送给数据库的sql显示出来-->
<property name="show_sql">true</property>
<!-- SQL方言,这边设定的是MySQL -->
<property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
<!-- 一次读的数据库记录数 -->
<property name="jdbc.fetch_size">50</property>
<!-- 设定对数据库进行批量删除 -->
<property name="jdbc.batch_size">30</property>
<!--驱动程序-->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- JDBC URL -->
<property name="connection.url">jdbc:mysql://localhost/fight_game?characterEncoding=utf-8</property>
<!-- 数据库用户名-->
<property name="connection.username">root</property>
<!-- 数据库密码-->
<property name="connection.password">root</property>

<!-- 使用本地事务jdbc事务,如果是使用全局jta事务,则需要配置为jta-->

<property name="current_session_context_class">thread</property>
<mapping class="cn.com.model.User" />
</session-factory>
</hibernate-configuration>

关于current_session_context_class配置项:

通过hibernate操作数据库时,主要是通过session实现的,session可以简单的视为对数据库的一个链接,有它的生命周期。获取session在SessionFactory里有两个方法,getCurrentSession()和openSession(),后者每次都会新建一个session,它们的区别:

1 、getCurrentSession创建的session会绑定到当前线程,而openSession不会。

2 、getCurrentSession创建的线程会在事务回滚或事物提交后自动关闭,而openSession必须手动关闭

因此,通常使用getCurrentSession()会方便高效一些,但需要在配置文件中配置current_session_context_class,可以有两个取值jta或者thread。

引用: 使用Hibernate的大多数应用程序需要某种形式的“上下文相关的” session,特定的session在整个特定的上下文范围内始终有效。然而,对不同类型的应用程序而言,要为什么是组成这种“上下文”下一个定义通常是困难的;不同的上下文对“当前”这个概念定义了不同的范围。在3.0版本之前,使用Hibernate的程序要么采用自行编写的基于 ThreadLocal的上下文session,要么采用HibernateUtil这样的辅助类,要么采用第三方框架(比如Spring或Pico),它们提供了基于代理(proxy)或者基于*(interception)的上下文相关session。

从3.0.1版本开始,Hibernate增加了SessionFactory.getCurrentSession()方法。一开始,它假定了采用JTA事务,JTA事务定义了当前session的范围和上下文(scope and context)。Hibernate开发团队坚信,因为有好几个独立的JTA TransactionManager实现稳定可用,不论是否被部署到一个J2EE容器中,大多数(假若不是所有的)应用程序都应该采用JTA事务管理。基于这一点,采用JTA的上下文相关session可以满足你一切需要。

更好的是,从3.1开始,SessionFactory.getCurrentSession()的后台实现是可拔插的。因此,我们引入了新的扩展接口 (org.hibernate.context.CurrentSessionContext)和新的配置参数 (hibernate.current_session_context_class),以便对什么是“当前session”的范围和上下文(scope and context)的定义进行拔插。

请参阅 org.hibernate.context.CurrentSessionContext接口的Javadoc,那里有关于它的契约的详细讨论。它定义了单一的方法,currentSession(),特定的实现用它来负责跟踪当前的上下文session。Hibernate内置了此接口的两种实现。

org.hibernate.context.JTASessionContext - 当前session根据JTA来跟踪和界定。这和以前的仅支持JTA的方法是完全一样的。详情请参阅Javadoc。 org.hibernate.context.ThreadLocalSessionContext - 当前session通过当前执行的线程来跟踪和界定。详情也请参阅Javadoc。

这两种实现都提供了“每数据库事务对应一个session”的编程模型,也称作每次请求一个session。Hibernate session的起始和终结由数据库事务的生存来控制。假若你采用自行编写代码来管理事务(比如,在纯粹的J2SE,或者 JTA/UserTransaction/BMT),建议你使用Hibernate Transaction API来把底层事务实现从你的代码中隐藏掉。如果你在支持CMT的EJB容器中执行,事务边界是声明式定义的,你不需要在代码中进行任何事务或 session管理操作。请参阅第 11 章 事务和并发一节来阅读更多的内容和示例代码。 hibernate.current_session_context_class 配置参数定义了应该采用哪个org.hibernate.context.CurrentSessionContext实现。注意,为了向下兼容,如果未配置此参数,但是存在org.hibernate.transaction.TransactionManagerLookup的配置,Hibernate会采用org.hibernate.context.JTASessionContext。一般而言,此参数的值指明了要使用的实现类的全名,但那两个内置的实现可以使用简写,即"jta"和"thread"。

在 SessionFactory 启动的时候, Hibernate 会根据配置创建相应的 CurrentSessionContext ,在 getCurrentSession() 被调用的时候,实际被执行的方法是 CurrentSessionContext.currentSession() 。在 currentSession() 执行时,如果当前 Session 为空, currentSession 会调用 SessionFactory 的 openSession 。所以 getCurrentSession() 对于 Java EE 来说是更好的获取 Session 的方法。

三、编写持久化对象

[java] view plain copy

package cn.com.model;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="t_user")
public class User implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;

private long id;

private String name;

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public long getId() {
return id;
}

public void setId(long id) {
this.id = id;
}

@Column(name="name",length=50)
public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

}
所有对象编写完后,需要在配置文件中配置,这里为:<mapping class="cn.com.model.User" />

四、测试

Configuration configuration = new AnnotationConfiguration();
configuration.configure();
SchemaExport export = new SchemaExport(configuration);
export.execute(true, true, false, true);
SessionFactory factory = configuration.buildSessionFactory();
// Session session = factory.openSession();
Session session = factory.getCurrentSession();
session.beginTransaction();
User user = new User();
user.setName("成都");
session.save(user);
session.getTransaction().commit();
// session.close();

关于SchemaExport对象有几个方法生成数据库结构。

1、create(boolean script,boolean export)

script:是否在控制台打印DDL语句,export为true时,会先执行drop再根据持久化对象create数据表,可能造成数据丢失,为false时,数据库需要先建立对应的数据表,否则会找不到表而报错,不会造成数据丢失。
2、drop(boolean script,boolean export)
script:是否在控制台打印DDL语句,export为true时,会执行drop操作,为false时不执行

3、execute(boolean script, boolean export,boolean justDrop, boolean justCreate)
当export为true时,justDrop为false,justCreate为true,如果对应的数据表不存在,则create,如果存在则不执行create操作
当export为true时,justDrop为true,justCreate为false,执行drop操作
因此,要新建数据表,最好使用create(true,true);
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
怀孕错过了糖筛怎么办 糖筛有哪些注意事项 怀孕几个月查唐筛 蔡家沟镇慈云寺 哈佳高铁高楞站多少平方米位置在那 超威电池生产日期怎么看 超威电池寿命一般多长时间 华晨宇鸟巢四面台10w+秒罄!!火星演唱会舞台概念图震撼发布! 手机连接160wifi电脑蓝屏使用160WiFi遇到问题应该如何解决 为什么手机wifi总是刚开启,锁屏就掉了。wifi设置里的休眠模式也是永久的... 建行卡为什么不能网上转账 学校发我们的建设银行卡一定要激活吗? 我打电话查余额说输入取钱密码... 《特利迦奥特曼》结名是什么? 科学家说植物喜欢听音乐,可是植物没耳朵怎么听? 特利迦的口碑,为何不如利维斯? 不同的植物对相同的音乐是否有相同的反应呢? 为什么植物听音乐能增产? 植物与音乐有着怎样的奇妙关系? 关于植物听音乐的问题 植物也爱听音乐吗? 《特利迦奥特曼》豆瓣评分跌破5.2分,是因为什么? 长安cs55方向盘多大尺寸?想装一个方向盘套 是音乐爱好者,或舞蹈家的植物是什么 植物听音乐有哪些好处? 植物也享受音乐!经研究表明经常听音乐的花会开得更好,这是怎么回事? 植物听音乐的原理是什么呢? 特利迦永恒之剑怎么画 音乐对植物生长会产生什么影响?原理分析 是音乐爱好者,舞蹈家的植物是什么 植物听音乐的原理是什么? 为什么植物也会欣赏音乐,音乐对植物有什么好处? 几何c方向盘尺寸 找大概在08.09的一本小说。男主一开始是炸了实验室穿越到了异世界,男主是私生子,8.9岁带回家 错误的近、反义词 卑鄙,谬误,懒惰反义词 哪位大神看过一部修仙小说,主角名字好像叫王强。 谬误的反义词(从文中第4丶5,6自然段中找) 错误的近义词是什么反义词是什么 谬误的近义词 怎么更换游戏使用的显卡 谬误的反义词 怎么换显卡 显卡吧 丧尸小说主角叫王强 正确的近反义词 我们的错误近反义词 false的用法,近义词,反义词。 喜悦,认真,荒谬的近、反义词 正确的近义词和反义词是什么? 不对、错误。 谬论的近义词是什么 谬论反义词是什么 正确的近义词和反义词 错误反义词