现在有这样一个需求,每个员工都有个ID,还有一个工号,ID是Oracle的序列,每次自动加1,而工号是个字符串,总共长8位,前面都是0,后面是员工ID,比如员工ID为88,则其工号为00000088,
首先,员工的工号总是8位,前面都是0,为了解决这个问题,需要在其工号的set方法中添加逻辑,如果工号长度不够8为,前面加0,这个比较好解决:
public void setJobNumber(String jobNumber) {
/*
* 由于需要获取长度,需要判断入参是否为空,防止空指针异常
*/
if(StringUtil.isNotEmpty(jobNumber)&&jobNumber.length()<Constant.JOB_NUMBER_LENGTH){
while(jobNumber.length()<Constant.JOB_NUMBER_LENGTH){
jobNumber="0"+jobNumber;
}
}
this.jobNumber = jobNumber;
}
下面就是解决工号获取序列的问题,先给出我的解决方案
Session session = getSession();
// session.merge(arg0)
Transaction tr = session.beginTransaction();
try {
session.save(user);
//员工工号绝对值取数据库中序列值
user.setJobNumber(user.getUserID().toString());
tr.commit();
} catch (HibernateException e) {
tr.rollback();
log.debug("regist failed,the reason is :" + e.getMessage());
return false;
} finally {
session.close();
}
之所以在session.save(user)再调用user.setJobNumber方法,是因为在save之后,user已经是persistent,此时的user已经和数据库中的一条记录管理,或者说,现在Hibernate已经将数据库中的序列值set到了UserID中了,此时再执行user.setJobNumber(user.getUserID().toString());完全可以获取到用户ID,再次之后,Hibernate也会将该变化映射到数据库中user对应的记录中,在提交之后,即将user变为detached之后,Hibernate会将JobNumber的变化映射到数据库上,即做更新操作,从Hibernate打印的SQL也可以看出实际执行过程:
Hibernate: select USER_ID.nextval from dual
Hibernate: insert into t_user (address, age, college, department, education, email, headPic, height, identity, jobNumber, married, name, nickName, password, phoneNo, role, sex, status, title, userext, weight, userID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: update t_user set jobNumber=? where userID=?
以上是本人的解决方法,不知道是否合理和妥当,或者有没有其他更好的解决方案呢??
分享到:
相关推荐
6. **反射和序列化支持**:`asm-3.3.1.jar`, `cglib-nodep-2.2.2.jar`, `dom4j-1.6.1.jar`, 和 `javassist-3.12.1.GA.jar` - 这些库用于动态代理、XML解析和对象的序列化,它们是Hibernate实现元对象工厂和动态代理...
在`nextValue()`方法中,它会与数据库进行交互,获取序列的下一个值。这个过程涉及到JDBC操作,包括SQL的执行和结果的处理。 3. **性能考虑** 使用序列主键策略有性能优势,因为序列通常在数据库层面创建和管理,...
此外,Hibernate Validator允许通过分组来组织约束,这包括请求分组、定义分组序列,以及重定义默认分组序列的方法,如@GroupSequence和@GroupSequenceProvider注解的使用。 约束组合是本手册的另一部分,这涉及...
例如,可以使用`<generator class="sequence">`定义序列生成器,或者使用`<generator class="native">`让Hibernate自动选择适合当前数据库的主键生成策略,如自动递增。 在启动Hibernate时,我们需要创建`...
它们通常继承自Hibernate的基类`Serializable`,以支持序列化。 3. **主键(Primary Key)**:每个实体都有一个唯一的标识符,被称为主键。在Hibernate中,这通常由@Id注解标记的属性表示。 4. **会话(Session)*...
这样,每当需要为`DEPARTMENT`表插入新记录时,就可以调用序列的`NEXTVAL`函数获取下一个可用的序列值作为主键。 ### 在Hibernate中配置序列(sequence) 为了在Hibernate中利用Oracle的序列(sequence)特性,需要在...
2. @Table:指定实体对应的数据库表名,可以设置别名、序列化等属性。 3. @Id:标识实体的主键字段,可以与@GeneratedValue结合使用自动生成主键。 4. @GeneratedValue:定义主键生成策略,如.AUTO、.IDENTITY、....
- **使用SQL查询**:在查询时,直接使用SQL语句来获取日期时间,避免Hibernate的自动转换。 - **自定义Type**:创建自定义的Hibernate类型,覆盖默认的日期时间处理方式,以满足特定需求。 以上就是关于"解决...
7. **hibernate.default_batch_fetch_size**:设置批量获取关联对象的数量,默认值可能需要根据实际应用情况进行调整,一般建议值为4、8或16。 8. **hibernate.default_entity_mode**:定义了SessionFactory打开的...
默认情况下,**Hibernate Validator** 使用默认分组序列来进行验证。但是,可以通过覆盖默认的分组序列来调整验证顺序。 ##### 5.5 分组转换 有时可能需要在不同的分组之间进行转换,以适应特定的业务逻辑需求。这...
除了创建序列外,还可以进行其他操作,如获取序列值、修改序列属性和删除序列等。 1. **获取序列值**: - 使用`NEXTVAL`获取序列的下一个值。 - 使用`CURRVAL`获取序列的当前值。 2. **修改序列属性**: - 可以...
详细讲解如何创建和获取 SessionFactory 实例,这是使用 Hibernate 必不可少的一步。 - **3.3 JDBC 连接** 解释如何配置 Hibernate 以使用特定的 JDBC 数据库驱动和连接池。 - **3.4 可选配置属性** 列举了...
6. **hibernate.jdbc.use_streams_for_binary**:在处理二进制或可序列化类型时使用流,提高效率。 7. **hibernate.jdbc.use_get_generated_keys**:在插入数据后,利用JDBC3的`getGeneratedKeys`方法获取自增列的...
Hibernate会创建一个序列,并在每次插入新记录时获取序列的下一个值。在映射文件中,可以使用`<generator class="sequence">`,而在注解中使用`@GeneratedValue(strategy = GenerationType.SEQUENCE)`。 3. **Table...
8. **可序列化接口(Serializable)**:`Serializable`接口在`get`方法中作为参数出现,表示主键`id`需要是可序列化的,这是Hibernate中常见的做法,因为主键可能会被传递到其他地方,例如在网络传输中。 以上就是`...
19. **hibernate.jdbc.use_get_generated_keys**: 开启后,Hibernate会在插入数据后通过`PreparedStatement.getGeneratedKeys()`获取数据库自动生成的键值。 这些参数的正确配置对于优化Hibernate性能、减少资源...
在Hibernate中,实体类通常继承自Hibernate提供的`Serializable`接口,表示对象可以被序列化,以便于持久化。同时,每个实体类的属性需要使用`@Column`注解来指定对应的数据库列,而主键则可以通过`@Id`注解来标识。...
Hibernate通过调用数据库的序列生成器来获取主键值。这是数据库特定的,不适用于所有数据库。 7. **native**: native策略会根据所使用的数据库选择最适合的策略,例如在MySQL上使用identity,在PostgreSQL上使用...
Hibernate Validator是Java社区规范JSR 380的参考实现,它是一个强大的校验器,用于校验Java Bean中的数据。它不仅支持JSR 303 Bean Validation规范定义的基本注解,还包括了一些额外的自定义约束注解。Hibernate ...