hibernate映射文件中的id标签以及联合主键
一、id标签
被映射的类必须定义对应数据库表主键字段。大多数类有一个JavaBeans风格的属性, 为每一个实例包含唯一的标识。<id> 元素定义了该属性到数据库表主键字段的映射
二、联合场景
学生表Student是由id和name联合形成主键
三、联合主键类的编写
1)实现java.io.Serializable接口
2)必须重写equals() 和 hashCode() 方法
package com.linys.model;
/**
* StudentId entity. @author MyEclipse Persistence Tools
*/
public class StudentId implements java.io.Serializable {
// Fields
/**
*
*/
private static final long serialVersionUID = 1L;
private Integer id;
private String name;
// Constructors
/** default constructor */
public StudentId() {
}
/** full constructor */
public StudentId(Integer id, String name) {
this.id = id;
this.name = name;
}
// Property accessors
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public boolean equals(Object other) {
if ((this == other))
return true;
if ((other == null))
return false;
if (!(other instanceof StudentId))
return false;
StudentId castOther = (StudentId) other;
return ((this.getId() == castOther.getId()) || (this.getId() != null
&& castOther.getId() != null && this.getId().equals(
castOther.getId())))
&& ((this.getName() == castOther.getName()) || (this.getName() != null
&& castOther.getName() != null && this.getName()
.equals(castOther.getName())));
}
public int hashCode() {
int result = 17;
result = 37 * result + (getId() == null ? 0 : this.getId().hashCode());
result = 37 * result
+ (getName() == null ? 0 : this.getName().hashCode());
return result;
}
}
三、学生类的编写
package com.linys.model;
/**
* Student entity. @author MyEclipse Persistence Tools
*/
public class Student implements java.io.Serializable {
// Fields
/**
*
*/
private static final long serialVersionUID = 1L;
private StudentId id;
private Integer age;
// Constructors
/** default constructor */
public Student() {
}
/** minimal constructor */
public Student(StudentId id) {
this.id = id;
}
/** full constructor */
public Student(StudentId id, Integer age) {
this.id = id;
this.age = age;
}
// Property accessors
public StudentId getId() {
return this.id;
}
public void setId(StudentId id) {
this.id = id;
}
public Integer getAge() {
return this.age;
}
public void setAge(Integer age) {
this.age = age;
}
}
四、映射文件
Student.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="com.linys.model.Student" table="student">
<composite-id name="id" class="com.linys.model.StudentId">
<key-property name="id" type="java.lang.Integer">
<column name="id" />
</key-property>
<key-property name="name" type="java.lang.String">
<column name="name" length="50" />
</key-property>
</composite-id>
<property name="age" type="java.lang.Integer">
<column name="age" />
</property>
</class>
</hibernate-mapping>
其中:
<composite-id 指定联合主键的信息
<key-property 指定在StudentId类中的联合信息
五、测试类
package com.linys.model;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
public class TestUniPk {
static SessionFactory sf;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
sf = new Configuration().configure().buildSessionFactory();
}
@Test
public void testUniPk(){
StudentId stuId=new StudentId();
//stuId.setId(1);
stuId.setName("linys");
Student stu=new Student();
stu.setAge(23);
stu.setId(stuId);
Session session =sf.openSession();
Transaction tr=session.beginTransaction();
session.save(stu);
tr.commit();
session.save(stu);
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
sf.close();
}
}
分享到:
相关推荐
在Hibernate中,有三种主要的注解方式来映射联合主键,以下是对这三种方式的详细解释: 1. **使用`@Embeddable`和`@Id`** 在这种映射方式中,联合主键的字段被放在一个单独的类中,这个类需要实现`java.io....
如果你使用的是XML映射文件,你需要在`.hbm.xml`文件中指定联合主键。如果使用注解,上述实体类已经包含了必要的信息。 4. **持久化操作:** 在MyEclipse中,你可以使用Hibernate工具或手动编写代码来执行CRUD...
在映射文件中,`<composite-id>` 标签用于声明联合主键,`<key-property>` 标签则指定了每个主键属性及其对应的数据库列。 4. **使用 Hibernate API**: 有了以上配置,你就可以在程序中通过 Hibernate API 来...
复合主键映射 <br>通常将复合主键相关属性,单独抽取出来,建立一个独立的类 * 必须实现序列化接口 * 必须实现equals和hashcode方法 采用<composite-id>标签进行映射,其它属性采用正常映射
在Hibernate中,实现联合主键可以通过使用`@Embeddable`和`@EmbeddedId`注解。首先,我们需要创建一个包含所有主键字段的类,并使用`@Embeddable`标记。这个类通常会作为其他实体类的属性,用`@EmbeddedId`注解。...
三、配置Hibernate映射文件 在XML配置时代,我们需要在Hibernate的映射文件(.hbm.xml)中显式声明复合主键。现在,大多数项目都使用注解配置,但如果你仍然需要处理旧的项目,这里是如何配置的示例: ```xml ...
【标题】:“Hibernate映射” 在Java开发领域,Hibernate是一个非常重要的对象关系映射(ORM)框架,它简化了数据库操作,将Java类与数据库表之间的关系进行了抽象,使得开发者可以像操作对象一样操作数据库。...
通过这种方式,你可以实现Hibernate中一对一单向外键关联及联合主键的配置。这使得两个实体间的关系更加明确,同时也方便了数据的管理和操作。在实际项目中,这样的设计可以提高数据的完整性和一致性。
如果使用XML映射文件,需要在`<class>`元素中指定`<composite-id>`。例如: ```xml <hibernate-mapping> <composite-id name="key" class="com.example.CompositeKey"> ...
本文将深入探讨这种映射方式,以及如何在Hibernate中实现它。 首先,我们需要理解这个映射策略的基本概念。在"每个类都对应一张表"的映射中,每个类(包括基类和所有子类)都会在数据库中被映射为一张独立的表。...
除了标准的EJB3注解,Hibernate还提供了一些自定义注解,如`@GeneratedValue`用于设置主键生成策略,`@Formula`用于在属性中使用SQL表达式,`@Cache`用于配置缓存,`@Filter`用于动态过滤数据,以及`@Parent`用于...
【Hibernate继承映射】是Java开发中...以上就是关于Hibernate继承映射、一对一关系、组件映射以及HQL的基础知识,这些概念和实践技巧在Java企业级开发中非常常见,熟练掌握能有效提高数据操作的效率和代码的可维护性。
联合主键映射涉及到多个字段共同构成主键的情况,可以使用 `<composite-id>` 标签来定义这些字段,并通过 `<key-property>` 或 `<key-many-to-one>` 子标签映射每个组成部分。 组件映射允许我们将一个类的属性映射...
在Hibernate中,这种关系可以通过配置XML映射文件或使用注解来实现。 首先,我们来看单向一对多关联的基本概念。在Java类中,我们将有一个“一”的类(如`Department`)和一个“多”的类(如`Employee`)。在`...
11. **继承映射**:Hibernate支持单表继承、联合继承和表-per-hierarchy等多种继承策略,使得对象模型的继承关系可以映射到数据库。 12. **代理(Proxy)**:Hibernate利用Java的动态代理机制,在需要时懒加载关联...
在Hibernate中,我们通常通过配置XML映射文件(hbm.xml)或使用注解来实现一对一关联。以XML为例,我们需要在两个实体类的映射文件中添加关联配置。假设我们有实体类`Person`和`Address`,`Person`拥有的`Address`...
- 在多对多关联中,如果使用自动生成的主键,确保中间表的主键是由两个外键构成的联合主键,而不是额外的自增ID。 - 检查关联关系的配置,确保关系的维护端正确,避免循环更新导致的问题。 综上所述,Hibernate的...
以下是这个例子的Hibernate映射文件: <id name="Key" column="pid" type="string"> </id> <component name="Name" class="eg.Name"> <!-- class attribute optional --> 人员(Person)表...