当前位置:文档之家› 注解配置复合主键

注解配置复合主键

注解配置复合主键
注解配置复合主键

hibernate 注解方式实现复合主键 有时一个实体的主键可能同时为多个,例如同样是之前使用的“CustomerEO”实体,需要通过name 和 email 来查找指定实体,当且仅当name 和email 的值完全相同时,才认为是相同的实体对象。要配置这样的复合主键,步骤如以下所示。

(1)编写一个复合主键的类CustomerPK ,代码如下。 CustomerPK.java

双击代码全选

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 import java.io.Serializable;

public class CustomerPK implements Serializable {

public CustomerPK() {

}

public CustomerPK(String name, String email) {

https://www.doczj.com/doc/4018247316.html, = name; this.email = email; }

private String email;

public String getEmail() {

return email; }

public void setEmail(String email) { this.email = email; }

private String name;

public String getName() {

return name; }

public void setName(String name) { https://www.doczj.com/doc/4018247316.html, = name;

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65 }

@Override

public int hashCode() {

final int PRIME = 31;

int result = 1;

result = PRIME * result

+ ((email == null) ? 0 : email.hashCode());

result = PRIME * result + ((name == null) ? 0 : name.hashCode());

return result;

}

@Override

public boolean equals(Object obj) {

if (this == obj)

return true;

if (obj == null)

return false;

if (getClass() !=

obj.getClass())

return false;

final CustomerPK other = (CustomerPK) obj;

if (email == null) {

if (other.email != null)

return false;

} else if

(!email.equals(other.email))

return false;

if (name == null) {

if (https://www.doczj.com/doc/4018247316.html, != null)

return false;

} else if

(!name.equals(https://www.doczj.com/doc/4018247316.html,))

return

false;

return true;

}

}

作为符合主键类,要满足以下几点要求。

l 必须实现Serializable 接口。

l 必须有默认的public 无参数的构造方法。

l 必须覆盖equals 和hashCode 方法。equals 方法用于判断两个对象是否相同,EntityManger 通过find 方法来查找Entity 时,是根据equals 的返回值来判断的。本例中,只有对象的name 和email 值完全相同时或同一个对象时则返回true ,否则返回false 。 hashCode 方法返回当前对象的哈希码,生成的hashCode 相同的概率越小越好,算法可以进行优化。

(2)通过 @IdClass 注释在实体中标注复合主键,实体代码如下。

双击代码全选

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 @Entity

@Table(name = "customer")

@IdClass(CustomerPK.class)

public class CustomerEO implements java.io.Serializable {

private Integer id;

public Integer getId() {

return this.id;

}

public void setId(Integer id) {

this.id = id;

}

private String name;

@Id

public String getName() {

return https://www.doczj.com/doc/4018247316.html,;

}

public void setName(String name) { https://www.doczj.com/doc/4018247316.html, = name;

25 26 27 28 29 30 31 32 33 34 35 36

}

private String email; @Id

public String getEmail() {

return email;

}

public void setEmail(String email) {

this.email = email;

}

} 标注复合主键时需要注意以下几个问题。

l @IdClass 标注用于标注实体所使用主键规则的类。它的定义如下所示。

1 2 3 4 @Target({TYPE}) @Retention(RUNTIME)

public @interface IdClass {

Class value();

}

属性Class 表示符合主键所使用的类,本例中使用CustomerPK 这个复合主键类。

l 在实体中同时标注主键的属性。本例中在email 和name 的getter 方法前标注@Id ,表示符合主键使用这两个属性。

(3)这样 定义实体的复合主键后,通过以下代码便可以获得指定的实体对象:

1 2 CustomerPK cpk = new

CustomerPK("Janet","janetvsfei@https://www.doczj.com/doc/4018247316.html,");

CustomerEO instance = entityManager.find(CustomerEO.class, cpk);

spring4.x + hibernate4.x 配置详解

spring4.x + hibernate4.x 配置详解 关于spring和hibernate的使用以及特征等等,在此不再啰嗦,相信大家也都知道,或者去搜索一下即可。 本篇博文的内容主要是我最近整理的关于spring4.x 和hibernate 4.x 相关配置和使用方式,当然spring3.x以及hibernate4.x也可以借鉴。 首先是配置文件web.xml 增加以下代码即可 contextConfigLocation classpath*:/applicationContext.xml org.springframework.web.context.ContextLoaderListener 然后建立 applicationContext.xml 文件,src下。文件内容如下,注释我尽量写的很详细 org.hibernate.dialect.MySQLDialect com.mysql.jdbc.Driver jdbc:mysql:///hibernatedemo root yzp140103 这样就配置好了。 接下来,要做的就是做开发测试了:在项目的src目录下新建一个实体类包com.joe.entity,在该包下新建一个实体类Student,代码如下: package com.joe.entity; import java.io.Serializable;

hibernateJTA标记

https://www.doczj.com/doc/4018247316.html,/cnbxj/blog/item/810acd01ca716b0d1c95837c.html Hibernate JPA标记学习 1.@Entity 通过注释@Entity或者(@Entity())表示被标示的类对应数据库中的一张表。 } @Entity public class TravelProfile { ... } 上面的例子告诉O/R映射引擎,类TravelProfile是可以持久化的,同时它对应数据库中的一张表。但是它没有指明对应哪个数据库中的哪张表。 2.元数据映射标记 2.1 @Table @Table()标记为实体初始化一张表,定义如下: @Target({TYPE}) @Retention(RUNTIME) public @interface Table { String name() default ""; String catalog() default ""; String schema() default ""; UniqueConstraint[] uniqueConstraints() default {}; } Name:指明表的名字。(可选) Catalog:表示表的catalog.(可选) Schema:表示表的schema.(可选) uniqueConstraints:制定表的唯一约束。(可选) 因为所有的属性都是可选的,也就是说@Table可以在进行映射的时候可以不标明。当不标明的情况下表的名字就是实体的类名。表属于的schema就是所属实体单元集的schema(就是当前连接数据库的用户)。 下面给出的例子中,指明表为CUST,所属的schema为RECORDS: @Entity @Table(name="CUST", schema="RECORDS") public class Customer { ... } 2.2 @UniqueConstraint标记 @UniqueConstraint用来指定表字段的唯一约束,定义如下: @Target({}) @Retention(RUNTIME) public @interface UniqueConstraint { String[] columnNames(); } columnNames:制定唯一约束的字段。 @Entity @Table(

springmvc框架搭建之xml配置说明(spring4+hibernate4)

SpringMVC框架搭建说明 Spring4.1.4 + hibernate4.3.8 1、web.xml配置 程序运行时从web.xml开始,加载顺序为:context-param -> listener -> filter ->structs (如果使用structs的话)-> servlet 如下为web.xml的配置说明 bmymis2 contextConfigLocation classpath:applicationContext-*.xml org.springframework.web.context.ContextLoaderListener encodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding UTF-8 forceEncoding true springServlet org.springframework.web.servlet.DispatcherServlet

hibernate数据持久化组件

hibernate数据持久化组件 1.基本概念: 1)对象持久化:把数据保存在永久的存储介质中(数据库)。 2)ORM(object relation mapping)对象关系映射。 3)POJO(PlainOldJavaObject)类是标准的Java Bean。PO持久化对象用于插入数据时候所使用POJO对象,BO业务对象,VO值对象 4)Hibernate就是一个可以自动的根据xml完成对象关系映射,并持久化到数据库的开源组件,底层也是由JDBC实现的。通过xml文件的配置,对数据库的底层的方言,以及数据库连接所需的信息,以及连接数据库的驱动。 5)hibernate的系统配置文件的名字一般叫做hibernate.cfg.xml,一般是映射类名.hbm.xml。一般将映射类的xml文件和实体类放在一起。 a)对象映射元文件: hibernate的映射类的XXXX.hbm.xml的写法(XXX一般跟所对应的POJO类的类名相同) package:映射类所在的包,注意:包中间用"."隔开 将类和数据库的表联系起来 声明标识属性,这个属性在PO中是必须的,所以一般创建对应表时必须定义主键,否则hibernate会将所有的列识别为一个复合主键 用于定义主键生成策略, assigned指定主键生成策略为用户指定,identity用于指定主键采用底层数据库提供的自增长 类中的属性和字段之间建立联系 在hibernate中其他类型可以自动识别只有Date类型必须指定,因为这里需要决定对应的时间精度问题

hibernate学习笔记

第一次课: 持久化:就是把瞬时状态的数据转变为持久化状态的数据,这一个过程就是持久化。 (java中内存分为:栈(变量,方法,形参都是在栈上),堆(new出来的对象在堆上)) 1)瞬时状态:刚new出来,在内存中存在的对象就是瞬时状态的。如果程序结束,对象就会被回收。 2)持久化状态:在磁盘或者是数据库中存在的数据就是持久状态。 Hibernate是什么? 1)是一个优秀的持久化框架,对jdbc进行进一步的封装。(hibernate,ibatis )。 2)是一个ORM (Object relation mapping ). Mysql,oracle,access 是关系型数据库 = hibernate操作的是对象。 使用hibernate的步骤:1)新建项目 2)引入jar包(hibernate最少依赖8个jar包) 3)新建 hibernate配置文件(hibernate.cfg.xml) ,放在src根目录下面。 用于数据库的配置信息。 com.mysql.jdbc.Driver root abc jdbc:mysql:///fwcz org.hibernate.dialect.MySQLDialect create 4)写bean/vo类,并且编写映射文件。

Hibernate-D1 试题

**学院课程考试试卷课程名称:《Hibernate:使用Hibernate&EJB开发持久层企业及应用》(A)卷 年级:班级: 姓名:_______________ 学号:_________________ 考试(考查) 闭卷 题号1-20 21-40 41-50 总分 分数 选择题(每题2分,共计100分) 1. 一个持久化类的实例可能存在的状态有()。[选三项] A.瞬态 B.持久态 C.隔离态 D.游离态 2. 面向对象概念中的对象与面向关系概念中的()相对应。 A.表 B.表的行 C.表的列 D.表中行的数据 3. 下面说法正确的是()。[选三项] A.Hibernate是一个开放源代码的对象关系映射框架 B.Hibernate是对JDBC进行了轻量级的对象封装 C.Hibernate可以大大减少操作数据库的工作量 D.Hibernate提供了数据查询机制,但没有提供恢复机制 4. JDBC编程的缺点( acd)。[选三项] A.实现业务逻辑的代码和数据库访问代码掺杂在一起, 使程序结构不清晰,可读性差 B.在程序代码中嵌入面向关系的SQL语句,使开发人员 能完全运用面向对象的思维来编写程序 C.业务逻辑和关系数据模型绑定,如果关系数据模型发 生变化,例如修改了CUSTOMERS表的结构,那么必须手工修 改程序代码中所有相关的SQL语句,这增加了维护软件的难度 D.如果程序代码中的SQL语句包含语法错误,在编译时不 能检查这种错误,只有在运行时才能发现这种错误,这增加了 调试程序的难度

-------------------------------------- 装-------------------------------------- 订------------------------------线 ---------------------------------------- 5. Hibernate 映射文件中子元素用来设定标识符 生成器,下面哪些是Hibernate 提供的内置实现( ABD )。[选三项] A .hilo B .native C .assign D .indentity 6. 关于SessionFactory 说法不正确的是( )。[选两项]BC A .它是线程安全的 B .它不是线程安全的 C .它是轻量级的 D .一个SessionFactory 实例对应一个数据库 据存储源 7. 关于Session 说法正确的是( BCD )。[选三项] A .它是线程安全的 B .它不是线程安全的 C .它是轻量级的 D .Session 也被称为持久化管理器,它 提供了和持久化相关的操作 8. 关于Configuration 说法正确的是()。[选三项]ABD A .Configuration 类的构造方法把默认路径下的hibernate. cfg.xml(或hibernate.properties)配置文件中的配置信息读入 到内存 B .Configuration 对象用于配置且启动Hibernate C .获得Configuration 的方法:Configuration config = n ew Configuration();///··.config() D .Hibernate 应用通过Configuration 实例来指定对象-关系 映射文件的位置或者动态配置Hibernate 的属性 9. 关于Transaction 说法正确的是( )。[选三项]ABD A .事务Transaction 为应用程序指定以原子操作单元范围的对象 B .在做对数据库的增加、修改和删除时一定要加上Transaction C .在做对数据库的查询时一定要加上Transaction D .获得Transaction 的方法:Transaction tr = session.begin Transaction(); 10. 如果数据库是MySql 或者SQLServer ,generator 属性值不可以用下面

马士兵hibernate文档 (个人完善版)

3. hibernate.hbm2ddl.auto : 在SessionFactory 创建时,自动检查数据库结构,或者将数据库schema 的DDL 导出到数据库。使用create-drop 时,在显式关闭SessionFactory 时,将删除掉数据库schema。 例如:validate | update | create | create-drop create :如果没有表就创建 update :如果表结构更新,就更新 validate :每次插入表的时候看看表结构有没有更新。 理论上是先建类后建表:这个时候只要你的类建好了,可以跨数据库。 实际中先建表比先建类多,建好表以后要对数据库进行优化,比如建索引,建试图,各种各样的优化。 project\etc目录下面有很多示例性的文档,log4j的文档就在那个下面。 SessionFactory sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory(); SessionFactory的建立是很耗费时间的,应该像连接池一样,只建立一次,以后要用就直接从那用。 Hibernate文档建议我们自己写一个辅助类,用单例来做。 JUnit的一个bug: @BeforeClass public static void beforeClass() { sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory(); } 在这句话的时候 配置文件如果有的时候写错了,她悄悄把错误隐藏起来了。 解决的方法:可以对这句话加try catch块 8.表名和类名不一致的时候: @Entity @Table(name="_teacher")

注解整理笔记

注解整理笔记 @是java中的注解。 JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。 1@SuppressWarnings("serial") 实体类注解例子 2@Entity 3@Table(name = "T_BASE_ROLE") 5@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE, region = CacheConstants.HIBERNATE_CACHE_BASE) //jackson标记不生成json对象的属性 4@JsonIgnoreProperties (value = { "hibernateLazyInitializer" , "handler","fieldHandler" ,"resources","users"}) public class Role extends BaseEntity implements Serializable { 6@Id 7@GeneratedV alue(strategy = GenerationType.AUTO) 8@Column(name = "ID") public Long getId() { return id;} @Excel(exportName="记录创建者", exportFieldWidth = 30) protected String createUser; 9@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+08:00") @Column(name = "CREATE_TIME", updatable = false) 10@Temporal(TemporalType.TIMESTAMP) public Date getCreateTime() { return createTime;} 11@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = https://www.doczj.com/doc/4018247316.html,ZY) 12@JoinTable(name = "T_BASE_ROLE_RESOURCE", joinColumns = { @JoinColumn(name = "ROLE_ID") }, inverseJoinColumns = { @JoinColumn(name = "RESOURCE_ID") }) 13@OrderBy("id") public List getResources() { return resources;} 14@Transient @SuppressWarnings("unchecked") public List getResourceIds() { if (!Collections3.isEmpty(resources)) { resourceIds = ConvertUtils. convertElementPropertyToList(resources, "id"); } return resourceIds;}

Struts+Spring+Hibernate框架搭建

整合SSH框架 整合框架版本:hibernate-distribution-3.6.0.Final-dist + spring-framework-2.5.6.SEC01-with-dependencies + struts-2.1.8.1 一、搭建工具 Windows 、Tomcat 6.0+ 、MyEclipse、SQLServer2008 R2 、Google 二、创建工程 新建WEB项目工程(MyEclipse),包含web.xml配置文件。 三、添加框架环境Junit4 右击新建的项目,选择Build Path —> Add Library —> Junit —> 选择Junit4 —> 确定完成单元测试的添加。 四、添加框架环境Struts2 1.解压struts- 2.1.8.1 ,如下图所示: 可在apps文件里,随机选择一个.war文件解压,到WEB-INF→lib下的基础jar文件:

复制黏贴添加到项目工程的lib下。也可将lib下的全部jar(71个)都复制到项目中来,不过很多用不到。我们崇尚即用即加的原则…… 2. 配置struts.xml和web.xml文件,如下: web.xml: ItcastOA struts2 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndE xecuteFilter struts2 /* index.html index.htm index.jsp default.html default.htm default.jsp struts.xml:

Hibernate常用知识点总结

一.Hibernate的流程 1.开发数据库,建立数据库表 2.通过DB Browser配置数据库连接 3.添加Hibernate的支持 (1)添加hibernate需要的jar包到WEB-INF/lib下 (2)添加hibernate.cfg.xml配置文件 (3)添加了HibernateSessionFactory.java类(session工厂类,用来产生session)4.映射表 (1)添加PO持久化类如:https://www.doczj.com/doc/4018247316.html,er.java (2)添加了持久化类和关系表对应配置文件如:User.hbm.xml(映射了类和表、属性和列之间对应,主键生成方式) 5.编写业务接口及实现类 6.编写测试类进行测试 二.Hibernate的基本配置 1.hibernate.cfg.xml true org.hibernate.dialect.MySQLDialect com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/hibernateTest root root 2.hibernate.properties 3.*.hbm.xml

hibernate_annotation

Hibernate Annotation 使用hibernate Annotation来映射实体 准备工作 下载 hibernate-distribution-3.3.2.GA hibernate-annotations-3.4.0.GA slf4j 导入相关依赖包 Hibernate HOME: \hibernate3.jar \lib\bytecode(二进制) \lib\optional(可选的) \lib\required(必须的) 导入required下的所有jar包 antlr-2.7.6.jar commons-collections-3.1.jar dom4j-1.6.1.jar hibernate3.jar javassist-3.9.0.GA.jar jta-1.1.jar slf4j-api-1.5.10.jar slf4j-log4j12-1.5.10.jar log4j-1.2.14.jar mysql.jar ---Annotation包 ejb3-persistence.jar hibernate-annotations.jar hibernate-commons-annotations.jar

简单的例子,通过annotation注解来映射实体PO 1、建立(Java Project)项目:hibernate_0100_annotation_HelloWorld_default 2、在项目根下建立lib目录 a)导入相关依赖jar包 antlr-2.7.6.jar commons-collections-3.1.jar dom4j-1.6.1.jar ejb3-persistence.jar hibernate-annotations.jar hibernate-commons-annotations.jar hibernate3.jar javassist-3.9.0.GA.jar jta-1.1.jar log4j-1.2.14.jar mysql.jar slf4j-api-1.5.10.jar slf4j-log4j12-1.5.10.jar 3、建立PO持久化类cn.serup.model.Teacher 内容如下 package cn.serup.model; import javax.persistence.Entity; import javax.persistence.Id; //@Entity表示该是实体类 @Entity public class Teacher { private int id ; private String username ; private String password ; //ID为主键,主键手动分配 @Id public int getId() { return id; } public void setId(int id) { this.id = id;

hibernate关联注解

说明: 本文对hibernate的一对多、多对一、多对多的关联 示例代码是Order类和OrderItem类的一对多的关系 1.一对多 1.1注解方式: @OneToMany 代码示例如下: 双向关联,维护端在“多”的一端 Public class Order implements Serializable { Private Set orderItems = new HashSet(); @OneToMany(mappedBy="order"(有了mappedby不能也不该在此再定义@joincolumn),cascade = CascadeType.ALL, fetch = https://www.doczj.com/doc/4018247316.html,ZY) @OrderBy(value= "id ASC") public Set getOrderItems() { return orderItems; } } 单向关联,维护端在此端 Public class Order implements Serializable { private Set orderItems = new HashSet(); @OneToMany(cascade = CascadeType.ALL, fetch = https://www.doczj.com/doc/4018247316.html,ZY) @JoinColumn(name=”order_id”) @OrderBy(value= "id ASC") public Set getOrderItems() { return orderItems; } } 1.2维护端和级联问题 维护端的意思是对外键进行维护,维护端有对外键进行插入和更新的权利。 下面分情况介绍hibernate的级联操作: 1.2.1单向关联 对“一”表进行插入一条记录的操作: 1)级联类型:CascadeType.ALL 执行语句: 1.insert into category (description, name, id) values(?, ?, ?)

相关主题
文本预览
相关文档 最新文档