使用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进行一对一单向外键关联,并且该关联涉及到联合主键的注解配置。 首先,一对一关联可以分为两种类型:单向和双向。在单向一对一关联中,只有一个实体知道另一个实体的存在,而另一...
3. 在使用复合主键时,要注意避免在多对一或一对多关系中直接使用复合主键作为外键,这可能导致映射问题。 总结,Hibernate对复合主键的处理为开发者提供了灵活性,使得处理复杂数据模型变得更加便捷。通过正确配置...
同时,Hibernate的Criteria API或HQL(Hibernate Query Language)可以帮助进行复杂的数据库查询,包括涉及多表连接的查询,这些查询可能涉及到联合主键和外键的使用。 综上所述,SSH2+JSON的结合提供了强大的后端...
在这个配置中,`studentId`字段在`Address`实体中作为联合主键的一部分,同时也作为`Student`实体的外键。`insertable = false, updatable = false`表示Hibernate不会尝试独立更新或插入`Address`的`studentId`,...
10. **多对一、一对多、多对多关联映射**: Hibernate支持各种复杂的关联关系,如实体间的关联映射配置,如外键、联合主键等。 综上,这份压缩包提供的文档涵盖了Hibernate的基本使用到高级特性,结合SQL参考手册,...
为了提高性能,我们可以使用`fetch="join"`(XML映射)或`@Fetch(FetchMode.JOIN)`(注解)进行联合查询,一次性获取所有关联的数据。 理解并熟练掌握Hibernate的单向一对多关联,能够帮助开发者更高效地处理复杂的...
1. **一对一关系**:使用`@OneToOne`注解,可以通过外键或者联合主键实现一对一关系。 2. **一对多关系**:使用`@OneToMany`注解,可以配置fetch模式(EAGER或LAZY)和cascade属性,处理关联对象的级联操作。 3. **...
3. @JoinColumn和@JoinTable:用于配置关联关系的细节,如外键、联合主键等。 三、级联操作与缓存 1. CascadeType:允许开发者定义实体间的级联操作,如保存、删除等,减少数据库操作次数。 2. 第二级缓存:默认...
当一个表的主键由两个或更多列组成时,需要使用联合主键。在 Hibernate 中,可以使用 `@EmbeddedId` 和 `@Embeddable` 注解来实现。 10. **自动生成主键 (GeneratedValue)** Hibernate 提供了多种主键生成策略,...
这种关系可以通过外键或者联合主键来建立。例如,一个用户可能只有一个唯一的身份证信息,这时可以创建两个类,User和IdCard,通过`@OneToOne`进行关联。 二、一对多关系映射(One-to-Many) 在一个实体中,如果一...
这些关联可以通过外键或联合主键实现。 8. **Cascading Operations**:通过设置cascade属性,可以指定操作(如保存、删除)是否应级联到关联的对象。 9. **Transactions**:Hibernate提供了一种方便的方式来管理...
通过配置外键、联合主键、映射集合等方式,可以灵活地处理各种复杂关系。 10. **自定义类型与类型转换** Hibernate允许开发者定义自己的类型,通过实现`UserType`接口,可以处理自定义的数据类型。此外,`...
可以使用`@OneToOne`注解实现,可以是外键约束或者主键共享。 - **一对多(One-to-Many)映射**:一个实体可以关联多个其他实体,比如一个班级有多名学生。这通常通过`@OneToMany`注解实现,可以设置`mappedBy`属性...
主键共享则是双方共享同一个主键,通常是联合主键。 ### 2. 外键约束的一对一映射 在一方实体类中,我们可以通过以下方式声明外键关联: ```java @Entity public class A { @OneToOne(mappedBy = "a") private ...
13. **其他高级特性**:如级联操作、联合主键、复合主键、外键约束、乐观锁和悲观锁等。 综上所述,《Hibernate3 帮助文档 CHM》是Java开发者不可或缺的参考资料,无论你是初学者还是经验丰富的开发者,都可以从中...
在Hibernate中,可以通过外键关联或联合主键来实现。 1. **外键关联** - 单向:一个实体类包含另一个实体类的引用,通过`@OneToOne`注解和`@JoinColumn`指定外键字段。 - 双向:两个实体类互相引用,使用`mapped...
9. **实体关系映射**:包括一对一、一对多、多对一、多对多等各种关系的映射,以及联合主键、外键约束等高级映射技巧。 10. **性能调优**:通过合理设置缓存策略、批处理、连接池等方式,可以显著提升Hibernate应用...
**联合主键(Composite Key)** 在某些场景下,可能需要多个字段共同构成主键。使用 @Embeddable 和 @EmbeddedId 注解可以定义复合主键。 以上就是 Hibernate 组件之间的关联关系及其配置方法的详细介绍。了解并...
在Hibernate中,可以通过自定义`<generator>`来实现联合主键。 总之,Hibernate提供了丰富的工具和方法来处理实体之间的关联关系,开发者可以根据实际需求选择合适的配置方式。理解这些关联关系的配置方式对于构建...
3. **中间表的配置**:创建一个无意义的联合主键,通常由两个外键组成,分别对应两个参与关联的实体的主键。 4. **关联注解**:在两个实体类中,使用`@ManyToMany`注解来指定关联,同时通过`@JoinTable`注解来定义...