JPA全称Java Persistence API,是一组用于将数据存入数据库的类和方法的集合。JPA通过JDK5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。JPA的目标是为了整合第三方ORM框架,建立一套标准的API。目前JPA的提供商包括ORacle,Redhat,Eclipse等,提供的产品包括Hiberate, Eclipselink, Toplink, Spring Data JPA等。
复合主键也就是说需要多个字段才能确定数据库记录中的唯一一行。这样就需要多个字段一起,组成主键,也叫联合主键。比如将PC中所有应用的网络信息保存到一个数据表中,可以将IP和端口设置为复合主键。
JPA中实现复合主键的SQL语言如下:
CREATE TABLE user_project(
user_id INT(20),
project_id INT(20),
timestamp VARCHAR (50),
donate_money DOUBLE(10,2),
PRIMARY KEY (user_id,project_id)
);
在代码中实现复合主键的方式有两种,一种是通过@IdClass注解指定复合主键对象;另一种是通过复合主键对象+@Embeddable,和实体对象+@Embedded注解。关于@IdClass的注解在此不做介绍,@Embedded和@Embedded的实现方式参考如下:
//主键类
@Embeddable
public class PrimaryKey implements Serializable{
private Integer a_id;
private Integer b_id;
public Integer getA_id() {
return a_id;
}
public void setA_id(Integer a_id) {
this.a_id = a_id;
}
public Integer getB_id() {
return b_id;
}
public void setB_id(Integer b_id) {
this.b_id = b_id;
}
}
//实体类
@Entity
@Table(name="A")
public class A{
@EmbeddedId
private PrimaryKey idCLass;
public PrimaryKey getIdCLass() {
return idCLass;
}
public void setIdCLass(PrimaryKey idCLass) {
this.idCLass = idCLass;
}
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3.1 增加操作
带有复合主键的数据库的保存操作,和只有单个主键的保存操作相同,如下:
3.2 查询操作
带有复合主键的数据库的查询操作,可以用复合主键作为整体进行查询
PrimaryKey primaryKey = new PrimaryKey();
primaryKey.setA_id(1);
primaryKey.setB_id(2);
repository.findOne(primaryKey);
3.3 更新操作
更新操作的参考代码如下:
@Transactional
@Modifying
public void update(A a) {
A finda = repository.findOne(a.getIdCLass()); //这里的repository是继承于JpaRepository的接口
finda.set(secondlevelEntity.getName());
}
3.4 删除操作
删除操作的参考代码如下:
@Transactional
@Modifying
public void update(A a) {
A finda = repository.findOne(a.getIdCLass()); //这里的repository是继承于JpaRepository的接口
repository.delete(finda);
}
1.
2.
3.
4.
5.
6.