星期日, 一月 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}
相关推荐
这里,@GeneratedValue用于指定主键生成策略,IDENTITY表示自动增长。 2.2 Column注解:用于指定字段映射到数据库的列名和类型,如: ```java @Column(name = "username", nullable = false) private String ...
- 默认情况下,Hibernate 使用`@GeneratedValue`来自动管理主键生成策略,如`GenerationType.IDENTITY`(自增列)、`GenerationType.SEQUENCE`(序列)或`GenerationType.AUTO`(根据数据库决定)。 3. **属性映射...
默认情况下,Hibernate会使用`GenerationType.AUTO`策略生成主键,但也可以自定义生成策略,如`GenerationType.IDENTITY`或`GenerationType.SEQUENCE`。 3. **属性映射**:使用`@Column`注解可以将类的属性映射到...
`@GeneratedValue` 可以与`@Id`结合使用,自动管理主键的生成策略,如自增、UUID等。 3. **属性映射注解** - **@Column**: 指定字段与数据库列的映射,可以设置列名、长度、是否可为空等属性。 - **@...
第1课 课程内容 6 第2课 Hibernate UML图 6 第3课 风格 7 第4课 资源 7 第5课 环境准备 7 ...三、 联合主键 24 1、xml方式 24 2、annotation方式 27 第14课 Hibernate核心开发接口(重点) 29 ........
这里,`@Entity`标识`User`类为实体,`@Table`指定了对应的数据库表,`@Id`和`@GeneratedValue`定义了主键的生成策略。 4. 关联关系注解 当处理实体之间的关联时,我们需要使用关联注解。例如,`User`与`Role`的...
- **联合主键关联(Annotation方式)**:两个对象通过联合主键进行关联。 - **Component(组件)关联映射** - **Component关联映射**:将一个对象的某些属性作为一个单独的对象进行处理。 - **User实体类**:表示...
1. `@GeneratedValue`:用于指定主键生成策略,如自增、UUID等。 2. `@OneToOne`, `@OneToMany`, `@ManyToOne`, `@ManyToMany`:这些注解用于定义实体间的关联关系,例如一对一、一对多、多对一和多对多。 3. `@...
- **策略实施**:通过XML或`@GeneratedValue`注解设置ID生成策略,理解不同策略如`AUTO`、`SEQUENCE`、`IDENTITY`和`TABLE`的工作原理。同时,探讨联合主键的概念及其在实际应用中的重要性。 #### 六、Hibernate...
第13课专注于ID主键的生成策略,包括Xml方式和AnnotateOn方式,如AUTO、IDENTITY、SEQUENCE、TABLE等策略,并讨论了联合主键的配置。 第14课是核心内容,介绍了Hibernate的主要开发接口,如`Configuration...
- **联合主键**:当一个实体的主键由多个字段组成时,可以通过XML或Annotation方式指定联合主键。 #### Hibernate核心开发接口 - **Configuration/AnnotationConfiguration**:负责读取配置文件,初始化...
- `@GeneratedValue`: 配置主键生成策略,如自动增长、序列等。 - `@Column`: 定义字段在数据库表中的列属性,如长度、是否可为空等。 - `@OneToMany`, `@ManyToOne`, `@OneToOne`, `@ManyToMany`: 分别表示一对一、...
3. `@Id`:标识实体类的主键字段,通常与`@GeneratedValue`一起使用,用于自动生成主键值。 4. `@GeneratedValue`:配置主键生成策略,如.AUTO(自动选择策略)、.IDENTITY(数据库自增)、.SEQUENCE(序列)等。 5....
mybatis实战教程mybatis in action之九mybatis 代码生成工具的使用 mybatis SqlSessionDaoSupport的使用附代码下载 转自:http://www.yihaomen.com/article/java/302.htm (读者注:其实这个应该叫做很基础的入门...
例如,`@Entity`表示一个Java类对应数据库中的一个表,`@Id`标识主键,`@GeneratedValue`定义主键生成策略等。 3. **SessionFactory与Session**:在Hibernate中,SessionFactory是线程安全的,负责创建Session对象...
1. Entity:通过@Entity注解标记的类表示数据库表,@Id标注主键字段,@GeneratedValue指定自增策略。 2. Table/Column:使用@Table和@Column注解来指定表名和字段名,其他如@Temporal、@Lob等注解用于特殊类型的映射...
- `@GeneratedValue`:用于定义主键生成策略。 **示例**: ```java @Entity @Table(name = "Person") public class Person { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; ...
- `@Id`: 标记属性为主键,可以指定主键的生成策略,如`TABLE`、`SEQUENCE`、`IDENTITY`等。 - `@GeneratedValue`: 定义标识字段的生成方式。 ##### 3. 复合主键(Composite Primary Key) 复合主键是指使用多个...
- **字段映射**: @Id、@GeneratedValue、@Column等注解的使用,定义主键生成策略和字段属性。 - **关联映射**: @OneToOne、@OneToMany、@ManyToOne、@ManyToMany等,处理对象之间的关系。 **4. Session操作** - **...
触发器实现的主键生成器(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. 多对...