`

025_ID生成策略_联合主键_Annotation

 
阅读更多

星期日, 一月 03, 2016   17:20:10

 

 

文档

\zhuhw\hibernate\jar\hibernate-annotations-3.4.0.GA\doc\reference\zh_cn\html_single

2.2.. 映射主键属性

 

下面是定义组合主键的几种语法:

 1.将组件类注解为@Embeddable,并将组件的属性注解为@Id   ok

2.将组件的属性注解为@EmbeddedId    ok

3.将类注解为@IdClass,并将该实体中所有属于主键的属性都注解为@Id 

 

 

对于Teacher这个类进行的联合组件方法:

1.生成一个TeacherPK;

在这个类上面@Embeddable

 

2.在Teacher进行的@Id

 

3.再写HibernateIDTest.java

 

 

3.将类注解为@IdClass,并将该实体中所有属于主键的属性都注解为@Id

 

将TeacherPK不用了,直接在Teacher中进行setID  getID...

加注解@IdClass指明就可以,更符合编程的习惯。  (两个联合起来正好是一个TeacherPK.class)

 

代码案例:

 

/hibernate_0400_ID/src/com/zhuhw/hibernate/model/TeacherPK.java

 

package com.zhuhw.hibernate.model;

import javax.persistence.Embeddable;

/*@Embeddable// 1.将组件类注解为@Embeddable,并将组件的属性注解为@Id 
*/public class TeacherPK implements java.io.Serializable{
@Override
public boolean equals(Object o) {
if(o instanceof TeacherPK) {
TeacherPK spk = (TeacherPK)o;
if(this.id == spk.getId()&& this.name == spk.getName()){
return true;
}
}return false;
}
@Override
public int hashCode() {
// TODO Auto-generated method stub
return this.name.hashCode();
}
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private String name;
}

 

/hibernate_0400_ID/src/com/zhuhw/hibernate/model/Teacher.java

 

package com.zhuhw.hibernate.model;

import java.util.Date;

import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

/*1.实体类(使用annotation进行实现,告诉hibernate是实体类,
 * 不需要再建立Teacher.hbm.xml文件进行映射)
 * 2.hibernate.cfg.xml进行配置即可
 * 3.建立一个TeacherTest
*/
@Entity

//表名和类名不同,对表名进行配置
//@Table(name = "_teacher")

@IdClass(value=TeacherPK.class)//两个联合起来正好是一个TeacherPK.class
public class Teacher {
private int id;
private String name;
/*
3.将类注解为@IdClass,并将该实体中所有属于主键的属性都注解为@Id

将TeacherPK不用了,直接在Teacher中进行setID  getID...
加注解@IdClass指明就可以,更符合编程的习惯。*/
/*private TeacherPK tpk;*/
/*@Id// 1.将组件类注解为@Embeddable,并将组件的属性注解为@Id 
*/
@EmbeddedId//2.将组件的属性注解为@EmbeddedId 
/*public TeacherPK getTpk() {
return tpk;
}
public void setTpk(TeacherPK tpk) {
this.tpk = tpk;
}*/

private String title;
private Date birthdate;
//ZhiCheng   enum
private ZhiCheng zhicheng;
/*@Enumerated(EnumType.STRING)
* 数据库存储String
`zhicheng` varchar(255) DEFAULT NULL,
*/
/*@Enumerated(EnumType.ORDINAL)
* 数据库存储下标值
`zhicheng` varchar(255) DEFAULT NULL,*/
@Enumerated(EnumType.ORDINAL)
public ZhiCheng getZhicheng() {
return zhicheng;
}
public void setZhicheng(ZhiCheng zhicheng) {
this.zhicheng = zhicheng;
}
//映射日期与时间类型,指定时间精度
//通过@Temporal可以指定时间的精度
@Temporal(value=TemporalType.DATE)
public Date getBirthdate() {
return birthdate;
}
public void setBirthdate(Date birthdate) {
this.birthdate = birthdate;
}
private String yourWifeName;
//不要存到数据库中
/*@Transient*/
public String getYourWifeName() {
return yourWifeName;
}
public void setYourWifeName(String yourWifeName) {
this.yourWifeName = yourWifeName;
}
//主键
@Id
@GeneratedValue
public int getId() {
return id;
}
@Basic//对数据库中,字段名和属性相同
public void setId(int id) {
this.id = id;
}
//字段名属性不同a)Annotation:@Column
@Column(name = "_name")
@Id
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}

 

 

 

 

/hibernate_0400_ID/test/com/zhuhw/hibernate/model/HibernateIDTest.java

 

package com.zhuhw.hibernate.model;

import java.util.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

public class HibernateIDTest {
public static SessionFactory sf = null;
@BeforeClass
public  static void beforeClass(){
sf = new AnnotationConfiguration().configure().buildSessionFactory();
}
@Test
public void TestStudentID(){
Student s = new Student();
/*配置文件中使用generator
* s.setId(9);
* */
StudentPK spk = new StudentPK();
spk.setId(11);
spk.setName("waxun");
s.setAge(8);
s.setSpk(spk);
Session session = sf.openSession();
session.beginTransaction();
session.save(s);
session.getTransaction().commit();
session.close();
}
@Test
public void TestTeacherID(){
Teacher t = new Teacher();
/*	TeacherPK tpk = new TeacherPK();
tpk.setId(1);
tpk.setName("waxun");*/
/*t.setName("yuzhou1");*/
/*t.setTpk(tpk);*/
t.setId(1);
t.setName("waxun");
t.setTitle("ccc");
t.setBirthdate(new Date());
t.setYourWifeName("yourWifeName1");
t.setZhicheng(ZhiCheng.A);
//因为使用的annotation,所以Configuration要使用AnnotationConfiguration
/*Configuration cf = new AnnotationConfiguration();
SessionFactory sf = cf.configure().buildSessionFactory();*/
Session session = sf.openSession();
//在hibernate中执行操作要在一个事务里面
session.beginTransaction();
session.save(t);
session.getTransaction().commit();
session.close();
}
@AfterClass
public static void afterClass(){
sf.close();
}
}

 

 

 

 

/hibernate_0400_ID/src/hibernate.cfg.xml

 

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

    <session-factory>

        <!-- Database connection settings -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost/hibernate</property>
        <property name="connection.username">root</property>
        <property name="connection.password">root</property>

        
        <!--
        <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
        <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
        <property name="connection.username">scoot</property>
        <property name="connection.password">tiger</property>-->
        
        <!-- JDBC connection pool (use the built-in) -->
        <!--<property name="connection.pool_size">1</property>-->

        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

        <!-- Enable Hibernate's automatic session context management -->
        <!--<property name="current_session_context_class">thread</property>-->

        <!-- Disable the second-level cache  -->
        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>
        <property name="format_sql">true</property>

        <!-- Drop and re-create the database schema on startup -->
        <property name="hbm2ddl.auto">update</property>
      
        <mapping resource="com/zhuhw/hibernate/model/Student.hbm.xml"/>

   <mapping class="com.zhuhw.hibernate.model.Teacher"/>  
    </session-factory>

</hibernate-configuration>

 

 

 

 

 

 

 

 

 

运行结果:

 com.zhuhw.hibernate.model.Teacher{zhicheng=0, title=ccc, tpk=component[id,name]{id=1, name=waxun}

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    hibernate_annotation

    这里,@GeneratedValue用于指定主键生成策略,IDENTITY表示自动增长。 2.2 Column注解:用于指定字段映射到数据库的列名和类型,如: ```java @Column(name = "username", nullable = false) private String ...

    Hibernate Annotation 学习笔记

    - 默认情况下,Hibernate 使用`@GeneratedValue`来自动管理主键生成策略,如`GenerationType.IDENTITY`(自增列)、`GenerationType.SEQUENCE`(序列)或`GenerationType.AUTO`(根据数据库决定)。 3. **属性映射...

    Hibernate Annotation应用

    默认情况下,Hibernate会使用`GenerationType.AUTO`策略生成主键,但也可以自定义生成策略,如`GenerationType.IDENTITY`或`GenerationType.SEQUENCE`。 3. **属性映射**:使用`@Column`注解可以将类的属性映射到...

    Hibernate annotation 详解

    `@GeneratedValue` 可以与`@Id`结合使用,自动管理主键的生成策略,如自增、UUID等。 3. **属性映射注解** - **@Column**: 指定字段与数据库列的映射,可以设置列名、长度、是否可为空等属性。 - **@...

    Hibernate笔记 马士兵

    第1课 课程内容 6 第2课 Hibernate UML图 6 第3课 风格 7 第4课 资源 7 第5课 环境准备 7 ...三、 联合主键 24 1、xml方式 24 2、annotation方式 27 第14课 Hibernate核心开发接口(重点) 29 ........

    Hibernate annotations大全

    这里,`@Entity`标识`User`类为实体,`@Table`指定了对应的数据库表,`@Id`和`@GeneratedValue`定义了主键的生成策略。 4. 关联关系注解 当处理实体之间的关联时,我们需要使用关联注解。例如,`User`与`Role`的...

    Hibernate_学习笔记.

    - **联合主键关联(Annotation方式)**:两个对象通过联合主键进行关联。 - **Component(组件)关联映射** - **Component关联映射**:将一个对象的某些属性作为一个单独的对象进行处理。 - **User实体类**:表示...

    比较好的hibernat学习资料

    1. `@GeneratedValue`:用于指定主键生成策略,如自增、UUID等。 2. `@OneToOne`, `@OneToMany`, `@ManyToOne`, `@ManyToMany`:这些注解用于定义实体间的关联关系,例如一对一、一对多、多对一和多对多。 3. `@...

    hibernate学习笔记

    - **策略实施**:通过XML或`@GeneratedValue`注解设置ID生成策略,理解不同策略如`AUTO`、`SEQUENCE`、`IDENTITY`和`TABLE`的工作原理。同时,探讨联合主键的概念及其在实际应用中的重要性。 #### 六、Hibernate...

    马士兵hibernate笔记

    第13课专注于ID主键的生成策略,包括Xml方式和AnnotateOn方式,如AUTO、IDENTITY、SEQUENCE、TABLE等策略,并讨论了联合主键的配置。 第14课是核心内容,介绍了Hibernate的主要开发接口,如`Configuration...

    Hibernate学习笔记

    - **联合主键**:当一个实体的主键由多个字段组成时,可以通过XML或Annotation方式指定联合主键。 #### Hibernate核心开发接口 - **Configuration/AnnotationConfiguration**:负责读取配置文件,初始化...

    JPA视频教程_使用jpa映射关联和继承

    - `@GeneratedValue`: 配置主键生成策略,如自动增长、序列等。 - `@Column`: 定义字段在数据库表中的列属性,如长度、是否可为空等。 - `@OneToMany`, `@ManyToOne`, `@OneToOne`, `@ManyToMany`: 分别表示一对一、...

    hibernate注解中英文版

    3. `@Id`:标识实体类的主键字段,通常与`@GeneratedValue`一起使用,用于自动生成主键值。 4. `@GeneratedValue`:配置主键生成策略,如.AUTO(自动选择策略)、.IDENTITY(数据库自增)、.SEQUENCE(序列)等。 5....

    springmybatis

    mybatis实战教程mybatis in action之九mybatis 代码生成工具的使用 mybatis SqlSessionDaoSupport的使用附代码下载 转自:http://www.yihaomen.com/article/java/302.htm (读者注:其实这个应该叫做很基础的入门...

    Hibernate src

    例如,`@Entity`表示一个Java类对应数据库中的一个表,`@Id`标识主键,`@GeneratedValue`定义主键生成策略等。 3. **SessionFactory与Session**:在Hibernate中,SessionFactory是线程安全的,负责创建Session对象...

    hibernate所有开发包

    1. Entity:通过@Entity注解标记的类表示数据库表,@Id标注主键字段,@GeneratedValue指定自增策略。 2. Table/Column:使用@Table和@Column注解来指定表名和字段名,其他如@Temporal、@Lob等注解用于特殊类型的映射...

    eib3.0中的注解

    - `@GeneratedValue`:用于定义主键生成策略。 **示例**: ```java @Entity @Table(name = "Person") public class Person { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; ...

    EJB 注释精解(pdf版)

    - `@Id`: 标记属性为主键,可以指定主键的生成策略,如`TABLE`、`SEQUENCE`、`IDENTITY`等。 - `@GeneratedValue`: 定义标识字段的生成方式。 ##### 3. 复合主键(Composite Primary Key) 复合主键是指使用多个...

    Hibernate ORM 5.2.7.Final User Guide

    - **字段映射**: @Id、@GeneratedValue、@Column等注解的使用,定义主键生成策略和字段属性。 - **关联映射**: @OneToOne、@OneToMany、@ManyToOne、@ManyToMany等,处理对象之间的关系。 **4. Session操作** - **...

    hibernate 体系结构与配置 参考文档(html)

    触发器实现的主键生成器(Primary keys assigned by triggers) 5.1.5. composite-id 5.1.6. 鉴别器(discriminator) 5.1.7. 版本(version)(可选) 5.1.8. timestamp (可选) 5.1.9. property 5.1.10. 多对...

Global site tag (gtag.js) - Google Analytics