使用Hibernate的联合主键composite-id
如下:
有一个类A,在类B里面,所有的字段组成联合主键, 同时在里面定义了查询语句
<class name="com.test.A" table="T_BASE_SETTINGS">
<composite-id name="id" class="com.test.B">
<key-property name="name" type="com.text.util.DefaultStringType">
<column name="NAME"/>
</key-property>
<key-property name="value" type="com.text.util.DefaultStringType">
<column name="VALUE"/>
</key-property>
</composite-id>
</class>
<query name="GET_SURCHARGE_VALUE">
FROM com.test.A a
WHERE a.id.name =? and a.id.value=?
</query>
遇到的问题
1: 查询QUERY报错,发现是需要用name替换NAME, value替换VALUE,就是不要用COLUMN
2: 查出来的结果,虽然打log发现是有值,如:list.size() 为1 但是设置不到对象里面去, 就是因为有些字段在数据库里面是空的, 联合主键的就要保证每一个字段都不能为空,解决的办法就是自己实现string, 定义了一个类com.text.util.DefaultStringType 如下:
public class DefaultStringType implements UserType {
private static final String blankChart = "";
private static final int[] TYPES = new int[]{Types.VARCHAR};
/* (non-Javadoc)
* @see org.hibernate.usertype.UserType#assemble(java.io.Serializable, java.lang.Object)
*/
public Object assemble(Serializable cached, Object owner) throws HibernateException {
return null;
}
/* (non-Javadoc)
* @see org.hibernate.usertype.UserType#deepCopy(java.lang.Object)
*/
public Object deepCopy(Object value) throws HibernateException {
String copy = new String(value.toString());
return copy;
}
/* (non-Javadoc)
* @see org.hibernate.usertype.UserType#disassemble(java.lang.Object)
*/
public Serializable disassemble(Object value) throws HibernateException {
return null;
}
/* (non-Javadoc)
* @see org.hibernate.usertype.UserType#equals(java.lang.Object, java.lang.Object)
*/
public boolean equals(Object x, Object y) throws HibernateException {
if (x == y) return true;
if (x == null) return false;
return x.equals(y);
}
/* (non-Javadoc)
* @see org.hibernate.usertype.UserType#hashCode(java.lang.Object)
*/
public int hashCode(Object x) throws HibernateException {
return new HashCodeBuilder().append(x).toHashCode();
}
/* (non-Javadoc)
* @see org.hibernate.usertype.UserType#isMutable()
*/
public boolean isMutable() {
return false;
}
/* (non-Javadoc)
* @see org.hibernate.usertype.UserType#nullSafeGet(java.sql.ResultSet, java.lang.String[], java.lang.Object)
*/
public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException {
String value = (String) Hibernate.STRING.nullSafeGet(rs, names[0]);
return value == null ? "" : value;
}
/* (non-Javadoc)
* @see org.hibernate.usertype.UserType#nullSafeSet(java.sql.PreparedStatement, java.lang.Object, int)
*/
public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {
if (value.equals(blankChart)) {
Hibernate.STRING.nullSafeSet(st, null, index);
} else {
Hibernate.STRING.nullSafeSet(st, value, index);
}
}
/* (non-Javadoc)
* @see org.hibernate.usertype.UserType#replace(java.lang.Object, java.lang.Object, java.lang.Object)
*/
public Object replace(Object original, Object target, Object owner) throws HibernateException {
return original;
}
/* (non-Javadoc)
* @see org.hibernate.usertype.UserType#returnedClass()
*/
public Class returnedClass() {
return String.class;
}
/* (non-Javadoc)
* @see org.hibernate.usertype.UserType#sqlTypes()
*/
public int[] sqlTypes() {
return TYPES;
}
}
分享到:
相关推荐
9. **继承映射(Inheritance Mapping)**:Hibernate提供了单表继承、联合继承和表格分片等多种策略来处理Java类的继承关系在数据库中的映射。 10. **级联操作(Cascading)**:级联操作允许将一个实体的操作(如...
2. 联合主键:处理多个字段作为主键的情况。 3. 批量操作:`session.saveOrUpdateAll()`、`session.deleteAll()`等。 4. 分页查询:使用`FirstResult`和`MaxResults`限制返回结果数量。 **九、最佳实践** 1. 避免...
在实际应用中,我们经常会遇到需要使用复合主键的情况。复合主键是指由两个或多个字段共同组成的数据表主键,它可以更好地满足业务需求,并提高数据的一致性和完整性。本文将详细介绍Hibernate中如何支持数据库的...
2. **尽量不使用联合主键**:联合主键虽然可以减少冗余,但会增加查询复杂度,尤其是对于大型数据库而言。除非确实有必要,否则建议使用单一字段作为主键。 3. **ID 的生成机制**:不同的数据库有不同的 ID 生成...
在本课程"ACCP6.0 Y2 使用Hibernate开发租房系统 第一章"中,我们将深入探讨如何利用Java中的Hibernate框架来构建一个高效且实用的租房管理系统。北大青鸟ACCP6.0课程旨在培养具备专业技能的软件开发人员,而Y2jiva...
这个中文帮助文档将详细介绍以上各个知识点,以及可能遇到的问题和解决方案,对于开发者学习和使用Hibernate 3.2.0 RC1具有很高的参考价值。通过阅读文档,开发者可以更好地理解如何配置Hibernate,如何定义实体类,...
这篇博客"Hibernate关联关系疑问"可能探讨了在使用Hibernate处理对象关系映射(ORM)时遇到的一些关联问题。在ORM中,关联关系是数据库表之间的连接,如一对一、一对多、多对一和多对多关系。 1. **一对一关联...
- **1.1.1 设置**:这部分讲解了搭建 Hibernate 开发环境所需的步骤,包括 Java 开发环境的准备、Hibernate 库文件的获取以及开发工具的选择等。 - **1.1.2 第一个 class**:指导读者创建第一个 Java 类,该类将用于...
Struts2、Hibernate和Spring是Java开发中常用的三大框架,它们各自负责Web应用的不同层面:Struts2专注于表现层管理,...希望这个简要的整合教程能帮助你更好地理解和掌握Struts2、Hibernate和Spring的联合使用。
**描述:**该文档主要设计用于协助开发者解决在实际开发过程中遇到的与Hibernate框架相关的问题。它提供了一个全面的指南,深入解析Hibernate的各个功能和特性,使得开发者能够更好地理解和应用这个强大的对象关系...
通过合理配置`@ManyToMany`、`@OneToMany`等注解,以及使用中间表和级联操作,可以有效地处理复杂的业务逻辑,提高开发效率。在实际应用中,需要根据具体需求灵活调整关联映射的配置,以达到最佳的性能和可维护性。
下面将深入探讨Hibernate的核心概念、主要功能以及使用方法。 1. **核心概念** - **实体(Entity)**:在Hibernate中,实体是Java类,代表数据库表中的行。它们通过注解或XML配置与数据库表关联。 - **持久化类...
- **安全性考虑**:强调在使用Hibernate时需要注意的安全问题及解决方案。 - **调试技巧**:分享在开发过程中遇到问题时如何有效调试的技巧。 通过以上知识点的学习,读者不仅能掌握Hibernate的基本使用方法,还...
2. **避免使用联合主键**:联合主键虽然有助于确保唯一性,但在实际操作中会增加维护成本,并可能导致查询性能下降。 3. **ID生成机制的选择**:不同数据库提供的ID生成策略各不相同,合理选择可以提升性能。例如,...
在实际项目中,我们常常会遇到类的继承关系,而Hibernate提供了强大的支持来处理这种继承关系的映射。本教程以“Hibernate-lab2”为例,将深入探讨Hibernate中的继承映射,为初学者提供一个清晰的学习路径。 一、...
### Hibernate串讲知识点详解 #### 一、什么是Hibernate? Hibernate是一种Java...通过这些内容的学习,开发者可以更好地掌握Hibernate的使用方法,提高开发效率,同时也能更好地理解和解决实际开发中遇到的问题。
【Hibernate继承映射】是Java开发中使用Hibernate框架进行数据持久化时的一种重要技术,它允许我们将复杂的对象模型映射到数据库的表结构上。在实际项目中,我们经常遇到对象之间的继承关系,如抽象类和子类。...
- 联合主键与懒加载:合理使用@ManyToOne、@OneToOne等关联注解,避免N+1查询问题。 - 组合索引与查询优化:根据业务需求,设置合适的索引,提高查询效率。 8. 错误处理与调试 在遇到问题时,可以通过日志、异常...
Java Persistence API(JPA)是Java平台上的一个标准,用于管理关系数据库中的对象-关系映射(ORM)。JPA 2.0是该规范的一个重要版本,它在JPA ...这有助于在遇到问题时进行调试,或者在设计自己的ORM框架时作为参考。