`

hibernate 外键做联合主键

 
阅读更多

使用Hibernate的外键作为联合主键:

如:有三张表

product:其字段有 id,proColor,proName。id是主键

orders:字段有 id,amount,date。id是主键

order_details:字段有 proId,orderId,quantity,price。proId和orderId为联合主键,并且proId是product表的外键,orderId是orders表的外键

 

CREATE TABLE `product` (
  `id` int(11) NOT NULL,
  `proColor` varchar(255) DEFAULT NULL,
  `proName` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) 

CREATE TABLE `orders` (
  `id` int(11) NOT NULL,
  `amount` int(11) DEFAULT NULL,
  `date` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
)



CREATE TABLE `order_details` (
  `price` double DEFAULT NULL,
  `quantity` int(11) DEFAULT NULL,
  `orderId` int(11) NOT NULL DEFAULT '0',
  `proId` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`orderId`,`proId`),
  CONSTRAINT `FK_q2kymfpksk4xk8etdur1cv3kj` FOREIGN KEY (`proId`) REFERENCES `product` (`id`),
  CONSTRAINT `FK_msk76lwy2lb5nj4w78nfjhye6` FOREIGN KEY (`orderId`) REFERENCES `orders` (`id`)
)

 一: 使用@onetoone注解

使用hibernate配置:

1、product实体:

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class Product {
	private Integer id;
	private String proName;
	private String proColor;
	
	@Id
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getProName() {
		return proName;
	}
	public void setProName(String proName) {
		this.proName = proName;
	}
	public String getProColor() {
		return proColor;
	}
	public void setProColor(String proColor) {
		this.proColor = proColor;
	}
	
}

  

2、orders实体:

import java.util.Date;

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class Orders {
	private Integer Id;
	private Integer amount;
	private Date date;
	@Id
	public Integer getId() {
		return Id;
	}
	public void setId(Integer id) {
		Id = id;
	}
	public Integer getAmount() {
		return amount;
	}
	public void setAmount(Integer amount) {
		this.amount = amount;
	}
	public Date getDate() {
		return date;
	}
	public void setDate(Date date) {
		this.date = date;
	}
}

 

3、order_details实体:

import javax.persistence.Entity;
import javax.persistence.Id;


@Entity
public class Order_Details {
	private Order_Pro_PK id;
	private Integer quantity;
	private Double price;
	
	@Id
	public Order_Pro_PK getId() {
		return id;
	}
	public void setId(Order_Pro_PK id) {
		this.id = id;
	}
	public Integer getQuantity() {
		return quantity;
	}
	public void setQuantity(Integer quantity) {
		this.quantity = quantity;
	}
	public Double getPrice() {
		return price;
	}
	public void setPrice(Double price) {
		this.price = price;
	}
	
	
	
}

 

4、因为在order_details表中的id,是联合主键,所以有了:

import java.io.Serializable;

import javax.persistence.Embeddable;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;

@Embeddable  
public class Order_Pro_PK implements Serializable {
	private static final long serialVersionUID = 1L;
	
	private Product product ;
	private Orders order ;
	
	@OneToOne
	@JoinColumn(name="orderId")
	public Orders getOrder() {
		return order;
	}
	public void setOrder(Orders order) {
		this.order = order;
	}
	
	@OneToOne
	@JoinColumn(name="proId")
	public Product getProduct() {
		return product;
	}
	public void setProduct(Product product) {
		this.product = product;
	}
	
	@Override
	public int hashCode() {
		return super.hashCode();
	}
	
	@Override
	public boolean equals(Object obj) {
		if(obj instanceof Order_Pro_PK){
			Order_Pro_PK cpk = (Order_Pro_PK) obj;
			if(cpk.getOrder().equals(this.getOrder()) && cpk.getProduct().equals(this.getProduct()) ){
				return true;
			}
		}
		return false;
	}
	
	
	
}

 

二、使用@manytoone注解

1、order实体

import java.util.Date;

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class Orders {
	private Integer Id;
	private Integer amount;
	private Date date;
	@Id
	public Integer getId() {
		return Id;
	}
	public void setId(Integer id) {
		Id = id;
	}
	public Integer getAmount() {
		return amount;
	}
	public void setAmount(Integer amount) {
		this.amount = amount;
	}
	public Date getDate() {
		return date;
	}
	public void setDate(Date date) {
		this.date = date;
	}
	
	
	
	
}

2、product实体

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class Product {
	private Integer id;
	private String proName;
	private String proColor;
	
	@Id
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getProName() {
		return proName;
	}
	public void setProName(String proName) {
		this.proName = proName;
	}
	public String getProColor() {
		return proColor;
	}
	public void setProColor(String proColor) {
		this.proColor = proColor;
	}
	
	
}

  

3、order_details实体

import javax.persistence.Entity;
import javax.persistence.Id;


@Entity
public class Order_Details {
	private Order_Pro_PK id;
	private Integer quantity;
	private Double price;
	
	@Id
	public Order_Pro_PK getId() {
		return id;
	}
	public void setId(Order_Pro_PK id) {
		this.id = id;
	}
	public Integer getQuantity() {
		return quantity;
	}
	public void setQuantity(Integer quantity) {
		this.quantity = quantity;
	}
	public Double getPrice() {
		return price;
	}
	public void setPrice(Double price) {
		this.price = price;
	}
	
	
	
}

 

4、联合主键

import java.io.Serializable;

import javax.persistence.Embeddable;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

@Embeddable  
public class Order_Pro_PK implements Serializable {
	private static final long serialVersionUID = 1L;
	
	private Product product ;
	private Orders order ;
	
	@ManyToOne
	@JoinColumn(name="orderId")
	public Orders getOrder() {
		return order;
	}
	public void setOrder(Orders order) {
		this.order = order;
	}
	
	@ManyToOne
	@JoinColumn(name="proId")
	public Product getProduct() {
		return product;
	}
	public void setProduct(Product product) {
		this.product = product;
	}
	
	@Override
	public int hashCode() {
		return super.hashCode();
	}
	
	@Override
	public boolean equals(Object obj) {
		if(obj instanceof Order_Pro_PK){
			Order_Pro_PK cpk = (Order_Pro_PK) obj;
			if(cpk.getOrder().equals(this.getOrder()) && cpk.getProduct().equals(this.getProduct()) ){
				return true;
			}
		}
		return false;
	}
	
	
	
}

 

 

其中在Order_Pro_PK类要重写equals和hashCode方法 

 

 

分享到:
评论

相关推荐

    Hibernate一对一单向外键关联 (联合主键annotation)

    本篇将详细讲解如何使用Hibernate进行一对一单向外键关联,并且该关联涉及到联合主键的注解配置。 首先,一对一关联可以分为两种类型:单向和双向。在单向一对一关联中,只有一个实体知道另一个实体的存在,而另一...

    hibernate复合主键配置和使用

    3. 在使用复合主键时,要注意避免在多对一或一对多关系中直接使用复合主键作为外键,这可能导致映射问题。 总结,Hibernate对复合主键的处理为开发者提供了灵活性,使得处理复杂数据模型变得更加便捷。通过正确配置...

    SSH2+JSO与三表联合主外键

    同时,Hibernate的Criteria API或HQL(Hibernate Query Language)可以帮助进行复杂的数据库查询,包括涉及多表连接的查询,这些查询可能涉及到联合主键和外键的使用。 综上所述,SSH2+JSON的结合提供了强大的后端...

    Hibernate教程08_关系映射之联合主键

    在这个配置中,`studentId`字段在`Address`实体中作为联合主键的一部分,同时也作为`Student`实体的外键。`insertable = false, updatable = false`表示Hibernate不会尝试独立更新或插入`Address`的`studentId`,...

    hibernate中文帮助文档

    10. **多对一、一对多、多对多关联映射**: Hibernate支持各种复杂的关联关系,如实体间的关联映射配置,如外键、联合主键等。 综上,这份压缩包提供的文档涵盖了Hibernate的基本使用到高级特性,结合SQL参考手册,...

    Hibernate 系列教程 单向一对多

    为了提高性能,我们可以使用`fetch="join"`(XML映射)或`@Fetch(FetchMode.JOIN)`(注解)进行联合查询,一次性获取所有关联的数据。 理解并熟练掌握Hibernate的单向一对多关联,能够帮助开发者更高效地处理复杂的...

    HibernateAPI struct spring

    1. **一对一关系**:使用`@OneToOne`注解,可以通过外键或者联合主键实现一对一关系。 2. **一对多关系**:使用`@OneToMany`注解,可以配置fetch模式(EAGER或LAZY)和cascade属性,处理关联对象的级联操作。 3. **...

    Hibernate3.2 API

    3. @JoinColumn和@JoinTable:用于配置关联关系的细节,如外键、联合主键等。 三、级联操作与缓存 1. CascadeType:允许开发者定义实体间的级联操作,如保存、删除等,减少数据库操作次数。 2. 第二级缓存:默认...

    hibernate的多种映射关系

    当一个表的主键由两个或更多列组成时,需要使用联合主键。在 Hibernate 中,可以使用 `@EmbeddedId` 和 `@Embeddable` 注解来实现。 10. **自动生成主键 (GeneratedValue)** Hibernate 提供了多种主键生成策略,...

    hibernate关联关系映射

    这种关系可以通过外键或者联合主键来建立。例如,一个用户可能只有一个唯一的身份证信息,这时可以创建两个类,User和IdCard,通过`@OneToOne`进行关联。 二、一对多关系映射(One-to-Many) 在一个实体中,如果一...

    Hibernate_API

    这些关联可以通过外键或联合主键实现。 8. **Cascading Operations**:通过设置cascade属性,可以指定操作(如保存、删除)是否应级联到关联的对象。 9. **Transactions**:Hibernate提供了一种方便的方式来管理...

    hiber开发指南 hibernate高级特性

    通过配置外键、联合主键、映射集合等方式,可以灵活地处理各种复杂关系。 10. **自定义类型与类型转换** Hibernate允许开发者定义自己的类型,通过实现`UserType`接口,可以处理自定义的数据类型。此外,`...

    用Hibernate映射继承关系

    可以使用`@OneToOne`注解实现,可以是外键约束或者主键共享。 - **一对多(One-to-Many)映射**:一个实体可以关联多个其他实体,比如一个班级有多名学生。这通常通过`@OneToMany`注解实现,可以设置`mappedBy`属性...

    hibernate 一对一双向带关联表映射练习

    主键共享则是双方共享同一个主键,通常是联合主键。 ### 2. 外键约束的一对一映射 在一方实体类中,我们可以通过以下方式声明外键关联: ```java @Entity public class A { @OneToOne(mappedBy = "a") private ...

    hibernate3 帮助文档CHM

    13. **其他高级特性**:如级联操作、联合主键、复合主键、外键约束、乐观锁和悲观锁等。 综上所述,《Hibernate3 帮助文档 CHM》是Java开发者不可或缺的参考资料,无论你是初学者还是经验丰富的开发者,都可以从中...

    Hibernate表关系总结(一对一,多对一,多对多)

    在Hibernate中,可以通过外键关联或联合主键来实现。 1. **外键关联** - 单向:一个实体类包含另一个实体类的引用,通过`@OneToOne`注解和`@JoinColumn`指定外键字段。 - 双向:两个实体类互相引用,使用`mapped...

    hibernate应用开发完全手册(源码)

    9. **实体关系映射**:包括一对一、一对多、多对一、多对多等各种关系的映射,以及联合主键、外键约束等高级映射技巧。 10. **性能调优**:通过合理设置缓存策略、批处理、连接池等方式,可以显著提升Hibernate应用...

    hibernate组件之间的关联

    **联合主键(Composite Key)** 在某些场景下,可能需要多个字段共同构成主键。使用 @Embeddable 和 @EmbeddedId 注解可以定义复合主键。 以上就是 Hibernate 组件之间的关联关系及其配置方法的详细介绍。了解并...

    Hibernate关联关系配置

    在Hibernate中,可以通过自定义`<generator>`来实现联合主键。 总之,Hibernate提供了丰富的工具和方法来处理实体之间的关联关系,开发者可以根据实际需求选择合适的配置方式。理解这些关联关系的配置方式对于构建...

    Hibernate多对多实例+数据库代码

    3. **中间表的配置**:创建一个无意义的联合主键,通常由两个外键组成,分别对应两个参与关联的实体的主键。 4. **关联注解**:在两个实体类中,使用`@ManyToMany`注解来指定关联,同时通过`@JoinTable`注解来定义...

Global site tag (gtag.js) - Google Analytics