`
liaokang.java
  • 浏览: 155123 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

JPA及联合主键的使用

    博客分类:
  • java
阅读更多
JPA全称为java persistence API,是原SUN公司提出的java持久化规范,它为开发人员提供一种对象/关系映射工具来管理java应用中的关系数据,它的出现是为了简化现有的持久化开发工作和整合ORM技术,结束了现在Hibernate,TopLink,JDO各自为营的局面,JPA不是一种ORM框架,它只是规范了现有的ORM技术,这点类似于JDBC,此时开发出来的应用不再依赖于某个开发商,在不修改代码的情况下,只要在JPA环境下应该都可以运行,做到了低耦合,可扩展性
JPA规范要求在类路径META-INF目录下放置persistence.xml,文件的名称是固定的,下面我就用联合主键的小例子来演示JPA的使用

1.新建一个java项目,引入所需的jar包,我选的JPA的实现框架是Hibernate,在src目录下新建一个文件夹META-INF,在其文件夹先新建配置文件persistence.xml
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
	version="1.0">
	<persistence-unit name="testJPA" transaction-type="RESOURCE_LOCAL">
		<properties>
			<property name="hibernate.dialect"
				value="org.hibernate.dialect.MySQL5Dialect" />
			<property name="hibernate.hbm2ddl.auto" value="update" />
			<property name="hibernate.connection.driver_class"
				value="com.mysql.jdbc.Driver" />
			<property name="hibernate.connection.url"
				value="jdbc:mysql://localhost:3306/数据库名?userUnicode=true&amp;characterEncoding=UTF-8" />
			<property name="hibernate.connection.username" value="root" />
			<property name="hibernate.connection.password"
				value="数据库密码" />

		</properties>
	</persistence-unit>
</persistence>


我用的是MYSQL数据库,所谓联合主键就是一个实体类中主键由两个或者两个以上字段构成,以下是以飞机票为例
联合主键类

package com.lamp.bean;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Embeddable;

@Embeddable
public class AirLinePK implements Serializable {

	private static final long serialVersionUID = -1487096630571343331L;

	private String startCity;

	private String endCity;
	
	public AirLinePK(){}

	public AirLinePK(String startCity, String endCity) {
		this.startCity = startCity;
		this.endCity = endCity;
	}

	@Column(length=3)
	public String getEndCity() {
		return endCity;
	}

	public void setEndCity(String endCity) {
		this.endCity = endCity;
	}

	@Column(length=3)
	public String getStartCity() {
		return startCity;
	}

	public void setStartCity(String startCity) {
		this.startCity = startCity;
	}

	@Override
	public int hashCode() {
		final int PRIME = 31;
		int result = 1;
		result = PRIME * result + ((endCity == null) ? 0 : endCity.hashCode());
		result = PRIME * result
				+ ((startCity == null) ? 0 : startCity.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 AirLinePK other = (AirLinePK) obj;
		if (endCity == null) {
			if (other.endCity != null)
				return false;
		} else if (!endCity.equals(other.endCity))
			return false;
		if (startCity == null) {
			if (other.startCity != null)
				return false;
		} else if (!startCity.equals(other.startCity))
			return false;
		return true;
	}

}


实体类

package com.lamp.bean;

import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;

@Entity
public class AirLine {
	private AirLinePK id;

	private String name;

	public AirLine(){}
	
	public AirLine(String startCity, String endCity, String name){
		this.id = new AirLinePK(startCity,endCity);
		this.name = name;
	}
	
	@EmbeddedId
	public AirLinePK getId() {
		return id;
	}

	public void setId(AirLinePK id) {
		this.id = id;
	}

	@Column(length=20)
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}


写个测试类
	@Test
	public void save(){
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("testJPA");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		
		em.persist(new AirLine("PEK","SHA","从北京飞上海"));
		
		em.getTransaction().commit();
		em.close();
		factory.close();
	}


既然说到了实体就不得不说说四种实体bean的存在方式
分别是新建,托管,游离,删除,新建,删除好理解,新建就是new一个新的对象,删除就是删除记录,托管是指在事务开启的情况下从数据库取出一条记录并将其某一属性值修改然后提交这样数据库中相应的记录就会得到更新,而游离也是在事务开启的情况下得到记录,不同托管的是实体管理器需将其下的所有实体变成游离状态,举个例子如下
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("testJPA"); 
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		Person person = em.find(Person.class, 1);
		em.clear();			//把实体管理器中的实体全部变成游离状态
		person.setName("游离状态后设置的名称");
		em.merge(person);
		em.getTransaction().commit();
		em.close();
		factory.close();

着眼未来几年的技术走向,JPA作为ORM领域标准化的整合者的目标不难实现,让我们共同期待
分享到:
评论

相关推荐

    JPA注解实现联合主键

    #### 使用JPA注解实现联合主键 在JPA中,我们可以通过`@IdClass`和`@Id`注解来实现联合主键。下面将详细介绍如何通过这些注解来实现联合主键。 ### 创建复合主键类 首先,需要创建一个复合主键类来存储需要组成...

    JPA_5_联合主键

    本篇文章将深入探讨JPA中的联合主键概念、实现方式以及其在实际应用中的使用场景。 ### JPA 基本概念 JPA 是一种Java规范,它提供了一种标准的方式来管理和持久化Java对象到关系数据库。通过使用JPA,开发者可以...

    15_传智播客JPA详解_JPA中的联合主键

    在JPA中,我们可以使用`@IdClass`或`@EmbeddedId`注解来实现联合主键。 1. **@IdClass注解**:当你需要创建一个单独的类来表示联合主键时,可以使用@IdClass。例如,假设我们有一个`Student`实体和一个`Course`实体...

    JPA中的联合主键

    在本篇文章中,我们将深入探讨JPA中的联合主键实现,以及如何在实际项目中使用它。 首先,让我们理解联合主键的基本概念。在关系数据库中,主键是用来唯一标识表中每一行记录的字段或字段组合。在JPA中,我们可以...

    JPA 联合主键

    **JPA 联合主键详解** 在Java Persistence API(JPA)中,主键是用于唯一标识实体的关键字段。通常,一个实体可能只有一个主键字段,但有些情况下,为了实现唯一标识,可能需要使用两个或多个字段的组合,这就是...

    JPA联合主键

    **JPA联合主键详解** 在Java Persistence API (JPA) 中,主键是用于唯一标识实体的关键字段。在很多情况下,一个实体的主键可能不是由单一字段组成,而是由两个或更多个字段共同构成,这样的主键就被称为联合主键...

    JPA详解视频教程 第15讲 JPA中的联合主键.avi

    JPA用于整合现有的ORM技术,可以简化现有Java EE和Java SE应用对象持久化的开发工作,实现ORM的统一。JPA详解视频教程 第15讲 JPA中的联合主键.avi

    15_JPA详解_JPA中的联合主键.zip

    **Java Persistence API (JPA)** 是Java平台上的一个标准,用于管理关系数据库中的对象-关系映射(ORM)。它的目标是提供一种简单、高效的API,让...理解并正确使用联合主键对于构建高效、可靠的JPA应用程序至关重要。

    JPA学习总结(五)--JPACompositePK联合主键

    在JPA中,我们可以使用`@IdClass`或`@EmbeddedId`注解来实现联合主键。 1. **@IdClass**:这种方式需要创建一个单独的类来表示联合主键,这个类需要实现Serializable接口,并且每个主键字段都用@Id注解标识。然后在...

    Spring Data JPA 建立表的联合主键

    在 Spring Data JPA 中,建立表的联合主键是一种常见的需求,本文将详细介绍如何使用 Spring Data JPA 建立表的联合主键,并提供了两种实现方式。 首先,我们需要了解什么是联合主键。在关系数据库中,主键是用于...

    使用@IdClass创建联合主键,并实现外部关联

    在 Java Persistence API(JPA)中,联合主键是指由多个字段组成的主键,可以使用@IdClass注解来实现。在本文中,我们将介绍如何使用@IdClass创建联合主键,并实现外部关联。 首先,我们需要创建三个实体类:...

    JPA主键策略(针对数据库自增字段重置后无效检查项)

    在使用这个策略时,JPA会将主键的生成工作交由数据库完成,hibernate 不会介入。这意味着,数据库将负责生成主键,而不是hibernate。这种策略适用于大多数情况,因为它可以确保主键的唯一性和连续性。 uuid uuid是...

    java hibernate使用注解来定义联合主键

    本文将详细介绍如何使用Hibernate注解来定义联合主键。 首先,我们需要了解联合主键的定义方式。在Hibernate API中,有三种方法来定义联合主键: 1. 使用`@Embeddable`注解定义一个独立的主键类,然后将这个类的...

    传智播客JPA学习笔记.pdf

    联合主键使用@EmbeddedId和@Embeddable注解,将多个字段组合成一个复合主键,适用于那些不满足单一主键条件的表。 以上就是JPA学习笔记中的关键知识点,涵盖了JPA的基本概念、环境配置、对象关系映射、查询语言、...

    JPA学习文档笔记

    - 通常情况下,还需要指定外键字段(`mappedBy`)或者联合主键(`@PrimaryKeyJoinColumn`)来明确关联关系。 - **一对多关联**: - 使用`@OneToMany`注解表示一对多关系,通常还需要使用`@JoinColumn`或`@JoinTable`来...

    自己整理的JPA帮助文档

    联合主键(Composite Key)** - 当主键由两个或更多个字段组成时,可以使用`@IdClass`或`@EmbeddedId`来定义。 **7. 异步和缓存** - **异步处理**: 可以结合Java的ExecutorService或Spring的AsyncConfigurer进行...

    JPA讲解视频

    8. **继承映射(Inheritance Mapping)**:JPA支持单表继承、联合继承和表格分层等策略,使你可以设计复杂的对象模型。 9. **懒加载(Lazy Loading)**:默认情况下,JPA实现如Hibernate支持懒加载,即关联的对象只...

    传智播客JPA学习笔记修改免积分版

    #### 十、JPA联合主键 - **概念介绍**: - 联合主键是指使用多个字段共同组成一个复合主键。 - **应用场景**: - 当单个字段不足以唯一标识一条记录时,可以考虑使用联合主键。 - **实现方式**: - 通过在实体类上...

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

    - **联合继承 (Joined Table Inheritance)**:每个子类对应数据库中的一个独立表,基类的公共属性存储在一个公共表中,子类的属性存储在子类表中,使用`@Inheritance(strategy=InheritanceType.JOINED)`。...

    使用jpa映射关联和继承

    使用`@Inheritance(strategy=InheritanceType.JOINED)`,每个子类需要额外定义`@Entity`和`@PrimaryKeyJoinColumn`来指定主键和父类的关联。 3. **表格分区继承(Table per Concrete Class)**:每个具体类都有一个...

Global site tag (gtag.js) - Google Analytics