java踩雷系列4-Hibernate(3)eclipse Maven Hibernate的使用

上一篇主要是hibernate的搭建和cfg.xml的粗略说明
补充一下上一篇:
首先数据库我使用的是Microsoft Sql Server 2008
在这里插入图片描述
这个数据库在C#中用的挺多(毕竟微软自己出的,用起来比其他数据库要方便的多,很多现成封装好的东西),但是在java中好像主要用的是oracle或者MySql什么的,使用这个数据库的比较少,资料也不是很多

eclipse默认是没有这个数据库的驱动的

驱动下载地址:https://www.microsoft.com/zh-CN/download/details.aspx?id=11774

下载之前请注意版本(如版本6.0)
下载得到sqljdbc_6.0.8112.200_chs.exe文件
JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API

运行之后指定英文目录后解压
得到以下目录结构:
在这里插入图片描述jre8中有一个sqljdbc42.jar的包
将这个包拿出来放在一个简单点的路径(如E盘底下)

安装jar包:
cmd:
mvn install:install-file -Dfile=E:\sqljdbc42.jar -Dpackaging=jar -DgroupId=com.microsoft.sqlserver -DartifactId=sqljdbc42 -Dversion=4.2

windows-show view-other-搜索 Data Source Explorer-new Connection Profile-新建一个连接
参照:https://www.cnblogs.com/sh086/p/8335188.html
配置sql server的连接就需要选定上面的jar包
填好IP,端口号(默认1433),数据库,sa,密码之后
测试连接:不成功则需要下载一个jar包:http://www.java2s.com/Code/Jar/j/Downloadjavaxxmlbindjar.htm
连接时添加这个jar包,再测试连接,测试连接成功后,我们才可以再进行下一步cfg文件的配置

Maven项目中Hibernate的依赖:
(第一个是Microsoft sqlserver 的jdbc,视不同数据库需要指定不同的jdbc)

		<dependency>
			<groupId>com.microsoft.sqlserver</groupId>
			<artifactId>sqljdbc4</artifactId>
			<version>4.0</version>
		</dependency>
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-core</artifactId>
			<version>5.0.0.Final</version>
		</dependency>
		<dependency>
			<groupId>javax.xml.bind</groupId>
			<artifactId>jaxb-api</artifactId>
			<version>2.3.0</version>
		</dependency>
		<dependency>
			<groupId>com.sun.xml.bind</groupId>
			<artifactId>jaxb-impl</artifactId>
			<version>2.3.0</version>
		</dependency>
		<dependency>
			<groupId>com.sun.xml.bind</groupId>
			<artifactId>jaxb-core</artifactId>
			<version>2.3.0</version>
		</dependency>
		<dependency>
			<groupId>javax.activation</groupId>
			<artifactId>activation</artifactId>
			<version>1.1</version>
		</dependency>
		<dependency>
			<groupId>org.glassfish.jaxb</groupId>
			<artifactId>jaxb-runtime</artifactId>
			<version>2.3.0</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.jboss.logging</groupId>
			<artifactId>jboss-logging</artifactId>
			<version>3.3.2.Final</version>
		</dependency>
		<dependency>
			<groupId>javax.validation</groupId>
			<artifactId>validation-api</artifactId>
			<version>1.1.0.Final</version>
		</dependency>

后面一堆的依赖纯粹是为了解决报Class Not Found的问题的
参考资料: https://blog.csdn.net/w405722907/article/details/80523790

下面粗略介绍hbm.xml
右键->new->other->选择hibernate.hbm.xml新建映射文件,选择指定的某个类
举例:拿了个项目中用到的电源下发记录
配置文件:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.Model.PowerSupplySendDownRecord" table="POWERSUPPLYSENDDOWNRECORD">
        <id name="id" type="int">
            <column name="ID" />
            <generator class="native" />
        </id>
        <property name="number" type="int">
            <column name="NUMBER" />
        </property>
        <property name="MsgType" type="int">
            <column name="MSGTYPE" />
        </property>
        <property name="STime" type="java.lang.String" >
            <column name="STIME" />
        </property>
        <property name="AckTime" type="java.lang.String">
            <column name="ACKTIME" />
        </property>
    </class>
</hibernate-mapping>

类:

package com.Model;

import java.util.Date;

public class PowerSupplySendDownRecord {
	public PowerSupplySendDownRecord() {
		lastSendTime = new Date();
	}

	public int id;
	public int number;
	public int MsgType;
	public String STime;
	public String AckTime;
	public Date lastSendTime;

	public int getId() {
		return id;
	}

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

	public int getNumber() {
		return number;
	}

	public void setNumber(int number) {
		this.number = number;
	}

	public int getMsgType() {
		return MsgType;
	}

	public void setMsgType(int msgType) {
		MsgType = msgType;
	}

	public String getSTime() {
		return STime;
	}

	public void setSTime(String sTime) {
		STime = sTime;
	}

	public String getAckTime() {
		return AckTime;
	}

	public void setAckTime(String ackTime) {
		AckTime = ackTime;
	}

}

一些毫无顺序临时想到有的没的需要注意的问题:
1.每个映射文件必须要有主键
建表的时候注意加个id就行了,这id如果没有什么特别的需求或用处,也要加上,让这个主键弄个自增就行了
如果真的没有主键->通过复合主键
即部分字段组成一个主键用来标识这行数据的唯一性
复合主键用的是composite-id来指定
随便找的一个参考资料:https://blog.csdn.net/wang_chaoju/article/details/39156405
不推荐这样写,这样配置文件好麻烦
或者干脆用原生sql语句去操作反而会更好吧。
因为hibernate的设定就是要有个主键标识,这样才能做load,update之类的各种操作

2.报错:hibernate.properties not found
<session-factory name="sessionFactory">
name=""
Hibernate试图将这个sessionFacoty注册到JNDI中,去掉这个配置,异样解除
(这个默认生成时会生成这个东西)

3.报错:HHH000182: No default (no-argument) constructor for class:
应该给javabean有一个无参的构造函数。
这个很好理解。

4.报错:org.hibernate.PropertyNotFoundException: Could not locate getter method for property
字段的两种权限:
access=“field”(通过插件创建的时候都默认给你指定了这个)
hibernate 通过反射获取属性

access=“property” (不指定时默认是这个属性)
hibernate同样使用反射获取该属性对应的get,set方法

如果使用第一种配置就不需要管那么多
使用第二种的话就要给这些属性指定getter和setter

默认生成getter和setter:打开对应的类->alt+shift+s->Genneral getter and setter,选中需要生成的属性,生成即可
Hibernate创建持久化类须符合JavaBean的规范,“get”,"set"后面紧跟属性的名字,并且属性名的首字母为大写。如果不遵守这个规则,Hibernate在运行时会抛出以上异常。

5.数据库中的dateTime如何在java中进行字段映射?
看网上的解决方法都好麻烦,什么用时间戳的
然后我想着平时写sql语句的时候,都用单引号括着时间字符串就可以了
所以这边试了一下,用String代替Date,timeStamp之类的,发现也是可行的
上述的sTime和AckTime,都是用String
获取当前时间然后再格式化为我想要的时间格式,用字符串存起来写到数据库里就解决了

6.我想弄一个inDBTime即写入数据库的时间,用于表现数据产生的时间再到写入数据库的时间有多大的延迟
当数据量大时这两个时间可能会相差几秒甚至更多,一般情况下都是相等的
解决方法:
在数据库中解决,可以给该表加一个触发器,after insert什么的,然后将这个inDBTime字段的值改为getDate()
通过hibernate可以改hql语句或者原生的sql语句,将这个字段值直接改为inDbTime

7.映射相关
一个表不同的字段分别映射不同的类?
这个是可以的,配置文件照常写,表名相同,但是讲究点还是将这个表拆分,不过如果贪图维护方便,还是一个表好一点的时候,这样的操作也是可行的

一对多和多对一,这两个从某种角度上来说是等价的
类比一个公司里有多个员工
公司是一,员工是多
公司的映射要指定
one-to-many
员工的映射要指定
many-to-one

多对多
类比一个玩家可以玩多个游戏,每个游戏有多个玩家
要有个中间表,两个外键对应了玩家和游戏的id,总共三个表

一对多和多对一,多对多这些暂时还没用到,以后用到可能会补充上去,先放个觉得写的挺好的链接:
https://www.cnblogs.com/biehongli/p/6561690.html

8.路径问题
这些配置文件都要放在资源文件夹下
cfg.xml文件一般使用默认命名,然后配置时就不需要指定,但是也可以给这个文件一个名称,但是使用时要指定名称

Configuration cfg = new Configuration().configure(cfgName);

如果不是放在资源文件夹下的根目录下,则需要写成这样:x/xx/xxx.cfg.xml
(相对路径,不能写绝对路径,而且这个只认资源文件夹内的东西)
映射文件中指定类名时:写的是包名x.x.x.类名
在配置文件中引用指定映射文件时,不能写包名,要写相对路径

		<mapping resource="x/xx/xxx/xxxx.hbm.xml" />
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值