对于一个轻量级的WEBserver来说 集成hirbernate的目的是为了节省开发时间.hirbernate是一个数据操作的框架 同时轻度封装JDBC.并且使用myEclipse的逆向工程插件.基本上操作数据不用写一行代码.
再结合XFIRE或者AXIS2之类的框架 和响应的插件, 创建一个webServer 数据接口 ,从请求的接收 到数据保存,读取 再到返回客户端 基本上不用几行代码.
其中学习和使用hibernate的过程中遇到的问题如下:
问题1:无法创建数据库.
解决方法:1:使用JDBC 创建.在serverlet 初始化的过程中调用如下代码
private static void creatDateBaseIfnoExist() {
PreparedStatement ps = null;
try {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = (Connection) DriverManager.getConnection(
"jdbc:mysql://"+url+"/", db_username, db_password);
ps = (PreparedStatement) conn.prepareStatement("CREATE DATABASE `"
+ dbName + "` CHARACTER SET utf8");
ps.execute();
ps.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
System.out.println(e.getMessage());
e.printStackTrace();
} finally {
}
}
WEN
问题2:使用APPFOG的云服务器 无法接触到MYSQL服务器.
这个问题带来的影响是 :
1:不能使用SQL脚本初始化数据库: 解决方法 :额外的创建一个 详情见 http://blog.csdn.net/yeqiuzs/article/details/8738196 按照教程和APPFOG的官网提示操作即可.(登陆的用户为非Root用户 只能添删改查和导入 导出 操作)
2:无法直接获取云服务器数据库的账号密码.和连接地址.因为他是服务器内部的地址实时变化的. 所以无法使用hirbernate的配置文件来初始化session
只能动态去创建. 动态创建的方式似乎只在hirbernate4.1后支持.(我一般喜欢用新的版本的开发包.) 所以只能到官网上去找找例子.
使用的code如下:
public static void rebuildSessionFactory() {
try {
// File file = new File("\\WEB-INF\\classes\\hibernate.cfg.xml");
System.out.println("onRebuildSessionFactory");
configuration = new Configuration();// 读取数据库连接的默认配置
configuration.setProperty("connection.driver_class",
"com.mysql.jdbc.Driver");
configuration.setProperty("sun.jnu.encoding", "UTF-8");
configuration.setProperty("file.encoding", "UTF-8");
configuration.setProperty("connection.url", "jdbc:mysql://"+Application.url+"/"
+ Application.dbName );// 动态的修改数据库的名称和地址
configuration.setProperty("hibernate.connection.url",
"jdbc:mysql://"+Application.url+"/" + Application.dbName);// 这句非常重要,通过DEBUG得知Configuration读取默认配置后会内部复制connection.url到hibernate.connection.url这个参数,两个一并修改
configuration.setProperty("connection.username", Application.db_username);
configuration.setProperty("hibernate.connection.username", Application.db_username);
configuration.setProperty("user.name", Application.db_username);
configuration.setProperty("connection.password", Application.db_password);
configuration.setProperty("hibernate.connection.password", Application.db_password);
configuration.setProperty("connection.pool_size", "2");
configuration.setProperty("hibernate.dialect",
"org.hibernate.dialect.MySQLDialect");
configuration.setProperty("show_sql", "true");
configuration.setProperty("myeclipse.connection.profile", "mysql");
configuration.setProperty("hbm2ddl.auto", "update");
configuration.addResource("org/gl/db/hebernate/bean/Program.hbm.xml");
configuration.addResource("org/gl/db/hebernate/bean/Station.hbm.xml");
serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
} catch (Exception e) {
System.err.println("%%%% Error Creating SessionFactory %%%%");
e.printStackTrace();
}
}
上面的代码是使用在HIBERNATE的逆向工程中自动生成的Sessionfactory中 替换那个方法即可 还有需要屏蔽掉 开头的静态代码段.负责 上面的方法动态构建方法不会执行.
如果提示权限错误(('java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)') 拒绝ROOT用户远程连接等 PS: 我在这里被卡住了.使用JDBC可以正常连接 使用HIBETNATE 就有这个问题 重新DEBUG .......得出上面的代码.网上一些人的解决这个问题方法简直是瞎猫去碰死耗子.....)
问题2:
com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: SELECT command denied to user 'usYunkN0AuxaM'@'10.0.43.194' for table 'program'
解决方法,放弃使用hirbernate