JPA联合主键并做从表外键

本文探讨了如何在Java持久化API(JPA)中设置联合主键,并将其作为从表的外键进行管理。通过实例解析了JPA配置联合主键和外键的步骤,详细介绍了相关数据库关系的建立和操作。

1. 数据库关系



@Embeddable
public class BasicOrderPK implements Serializable {
        ...
        // 联合主键的两个字段单独生成一个可嵌入的对象
	@Column(name="order_id")
	private int orderId;

	@Column(name="goods_code")
	private int goodsCode;
        ...
}


@Entity
@Table(name="basic_order")
@NamedQuery(name="BasicOrder.findAll", query="SELECT b FROM BasicOrder b")
public class BasicOrder implements Serializable {
	private static final long serialVersionUID = 1L;

	@EmbeddedId
        // 注入主键对象
	private BasicOrderPK id;

	//bi-directional many-to-one association to BasicUser
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="user_name")
	private BasicUser basicUser;

	//bi-directional many-to-one association to OrderDetail
	@OneToMany(mappedBy="basicOrder")
	private List<OrderDetail> orderDetails;
}


@Entity
@Table(name="order_detail")
@NamedQuery(name="OrderDetail.findAll", query="SELECT o FROM OrderDetail o")
public class OrderDetail implements Serializable {
        .....
	//bi-directional many-to-one association to BasicOrder
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumns({
                // 分别匹配主表联合主键的两个字段
		@JoinColumn(name="order_id", referencedColumnName="order_id"),
		@JoinColumn(name="goods_code", referencedColumnName="goods_code")
		})
	private BasicOrder basicOrder;
....
}



### JPA 中实体类及其主映射 在 Java 持久化 API (JPA) 的上下文中,定义实体类以及其主的映射是至关重要的。这不仅有助于保持数据库的一致性和完整性,还能够简化复杂查询的设计。 #### 定义实体类 要创建一个被 JPA 所管理的对象,即实体,需使用 `@Entity` 注解标记该类[^3]。此,还需指定唯一标识符字段作为主,通常通过 `@Id` 来完成这一工作。对于复合主或其他特殊情况,则可以考虑采用更复杂的策略如联合主键或嵌入式 ID。 ```java import javax.persistence.Entity; import javax.persistence.Id; @Entity public class User { @Id private Long id; // getters and setters... } ``` #### 设置主 当涉及到单列主时,除了上述提到的基础方式之,还可以利用序列生成器(`@GeneratedValue`)来自动生成唯一的数值型主值。这对于自动增长类型的场景非常有用。 ```java import javax.persistence.GeneratedValue; import static javax.persistence.GenerationType.IDENTITY; @Entity public class Product { @Id @GeneratedValue(strategy = IDENTITY) private Integer productId; // other fields, constructors, getters and setters... } ``` #### 建立关联关系 - 映射 建立两个之间的联系可以通过多种不同的方式进行建模,在这里主要讨论一对一、一对多两种常见的情况: - **一对一** 关系可通过 `@OneToOne` 注解来示,且经常伴随着 `@JoinColumn(name="...")` 使用以指明用于连接两张格的具体列名。 - **一对多** 或者反过来的 **多对一** 可能是最常用的关系形式之一;前者一般会出现在父端而后者则是在子端体现出来。这种情况下应该运用到 `@OneToMany(mappedBy="...")` 和 `@ManyToOne` 这样的组合来进行双向导航的支持。 下面给出了一组简单的例子说明如何在一个订单(Order)中有多个商品项(Item),同时也展示了反向引用的方式。 ```java // Order.java import java.util.List; import javax.persistence.*; @Entity @Table(name = "orders") public class Order { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long orderId; @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "order") private List<Item> items; // standard constructor / getter & setter methods omitted for brevity } // Item.java @Entity @Table(name = "items") public class Item { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long itemId; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "orderId", nullable = false) private Order order; // standard constructor / getter & setter methods omitted for brevity } ``` 以上代码片段展示了基本的一对多关系设置,其中 `Order` 类中的 `List<Item>` 达了一个订单可能包含若干个物品的事实,同时每个 `Item` 对象也持有指向所属 `Order` 的引用[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值