java实现多对多关系的方法_java – 如何在JPA中实现复杂的多对多关系?
这里是db模式
CREATE TABLE Products
(
id INT NOT NULL AUTO_INCREMENT,
category_id INT NOT NULL,
description VARCHAR(100),
price DECIMAL(10, 2) NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (category_id) REFERENCES Categories(id)
) ENGINE = INNODB;
CREATE TABLE Orders
(
id INT NOT NULL AUTO_INCREMENT,
customer_id INT NOT NULL,
status VARCHAR(20) NOT NULL,
date_created TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
FOREIGN KEY (customer_id) REFERENCES Customers(id)
) ENGINE = INNODB;
CREATE TABLE OrderDetails
(
product_id INT NOT NULL,
order_id INT NOT NULL,
quantity INT NOT NULL,
subtotal DECIMAL(10, 2) NOT NULL,
PRIMARY KEY (product_id, order_id),
FOREIGN KEY (product_id) REFERENCES Products(id),
FOREIGN KEY (order_id) REFERENCES Orders(id)
) ENGINE = INNODB;
模特
@Embeddable
public class OrderDetailPK
{
private Product product;
private Order order;
public OrderDetailPK() {}
public OrderDetailPK(Product product, Order order)
{
this.product = product;
this.order = order;
}
}
public class OrderDetail {
@EmbeddedId
private OrderDetailPK id;
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="product_id", insertable=false, updatable=false)
private Product product;
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="order_id", insertable=false, updatable=false)
private Order order;
private int quantity;
private double subtotal;
public OrderDetail() {}
public OrderDetail(OrderDetailPK id, int quantity, double subtotal)
{
this.product = id.getProduct();
this.order = id.getOrder();
this.quantity = quantity;
this.subtotal = subtotal;
}
// getters, setters
}
public class Product {
@Id
private int id;
private String description;
private double price;
@ManyToOne
@JoinColumn(name="category_id")
private Category category;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "Products")
private List orderDetail;
}
public class Order {
@Id
private int id;
@ManyToOne
@JoinColumn(name="customer_id")
private Customer customer;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "Orders")
private List orderDetail;
}
由于某些原因,我不断收到错误
Concrete type "class models.OrderDetail" with application identity does not declare any primary key fields.
谁能指出我问题出在哪里?谢谢
最佳答案 当我之前这样做时(详见
this question and answer),我在可嵌入的ID原语中创建了字段(对应于所引用实体的ID字段),然后在实体中使用了
@MapsId.我相信这是满足所有要求的最简单(并且我敢说是正确的):实体中的字段是关系,ID类中的字段是原始的,每列都只映射一次(@MapsId字段不是真正的映射,而是一些别名).
将其应用于您的案例,ID类如下所示:
@Embeddable
public class OrderDetailPK {
private final int productId;
private final int orderId;
public OrderDetailPK(int productId, int orderId) {
this.productId = productId;
this.orderId = orderId;
}
}
实体类看起来像:
public class OrderDetail {
@EmbeddedId
private OrderDetailPK id;
@ManyToOne(cascade = CascadeType.ALL)
@MapsId("productId")
private Product product;
@ManyToOne(cascade = CascadeType.ALL)
@MapsId("orderId")
private Order order;
private int quantity;
private double subtotal;
public OrderDetail(Product product, Order order, int quantity, double subtotal) {
this.id = new OrderDetailPK(product.getId(), order.getId());
this.product = product;
this.order = order;
this.quantity = quantity;
this.subtotal = subtotal;
}
protected OrderDetail() {}
}
java实现多对多关系的方法_java – 如何在JPA中实现复杂的多对多关系?相关推荐
- java实体外键_如何在JPA中添加用户实体和好友关系实体的外键
现有用户实体,相关代码如下: @Entity @Table(name = "t_users") public class User extends Model { @Id @Col ...
- java如何设置1.5倍行距_Java如何在iText中设置段落行间距?
要设置的行间距在iText的段落可以通过传递线空间/领先的参数进行Paragraph构造.在下面的示例中,我们将行距设置为32.我们还可以通过调用此对象的setSpacingBefore()和setS ...
- java多线程有几种实现方法_Java多线程之间实现通讯
一.课程目标 多线程之间如何通讯 wait.notify.notifyAll()方法 lock 停止线程 守护线程 Join方法 优先级 Yield 二.多线程之间如何实现通讯 2.1 什么是多线程之 ...
- java多线程同步的四种方法_java中实现多线程的两种方法
java多线程有几种实现方法,都是什么?同步有几种实java中多线程的实现方法有两种:1.直接继承thread类:2.实现runnable接口:同步的实现方法有五种:1.同步方法:2.同步代码块:3. ...
- java 集合遍有几种方法_Java 集合遍历的几种方法
以下实例演示了如何遍历从Collection接口延伸出的List.Set和以键值对形式作存储的Map类型的集合,以下我们分别使用了普通for,增强型的 for ,iterator 等方式来遍历集合: ...
- java如何使显示字符下标_Java如何在 Word 中设置上、下标
上标是指比同一行中其他文字稍高的文字,而下标是指比同一行中其他文字稍低的文字.在生活中,我们常见的平方米.立方米等符号以及化学中的各种元素符号,都是利用上.下标来表示的.本文将介绍通过Free Spi ...
- java如何实取随机数_java - 如何在Kotlin中获取随机数?
java - 如何在Kotlin中获取随机数? 可以在2个参数之间返回随机整数的通用方法,如ruby,可以使用rand(0..n). 有什么建议吗? 16个解决方案 208 votes 我的建议是In ...
- java for 下标_Java如何在 Word 中设置上、下标
上标是指比同一行中其他文字稍高的文字,而下标是指比同一行中其他文字稍低的文字.在生活中,我们常见的平方米.立方米等符号以及化学中的各种元素符号,都是利用上.下标来表示的.本文将介绍通过Free Spi ...
- java搜索excel表格里的数据_Java读取Excel表格中的数据
前言 本文主要讲述如何在Java中读取Excel表中的数据并在控制台输出,实现工具为Eclipse 提示:以下是本篇文章正文内容,下面案例可供参考 一.添加jar包文件 描述:在Java中导入导出Ex ...
最新文章
- 【iOS官方文档翻译】iOS的蓝牙连接、数据接收及发送
- Oracle体系结构之密码文件管理
- python --闭包学习
- wxWidgets:wxPython 概述
- python高并发架构_python高并发的解决方案
- eclipse配置项目部署到到本地tomcat
- php算法求出一个数可以被分解成多少个_小学数学必考的34个数学重难点公式,赶紧给孩子收藏!...
- 小李飞刀:SQL题目刷起来!
- Security+ 学习笔记33 主机安全
- stella forum 知识库---一些错误的修补
- java模拟洗衣机程序,JAVA洗衣机仿真程序实验报告及代码
- C语言--16进制转字符串
- java 打印request的原始请求数据
- linux realtek声卡驱动下载,一步一步安装Realtek ALC888、ALC1200 声卡(附Realtek ALC888 ALC1200驱动)...
- 0x0000006B蓝屏问题解决方法
- 活化脂修饰NOTA,NOTA-NHS ester,CAS:1338231-09-6
- 计算机重做系统有什么好处,电脑卡重装系统有用吗|电脑太卡可以重装系统解决吗...
- 能测试快充真假的软件,苹果iOS 12可自行测试真假快充:山寨充电器无处遁形
- 只需 2 张照片就能 2D 变 3D,这个 AI 能自己脑补蜡烛吹灭过程
- 【欧拉计划第 5 题】最小公倍数 Smallest multiple
热门文章
- java序列化异常_Java|序列化异常StreamCorruptedException的解决方法
- win10任务管理器快捷键_你都知道吗?Win10任务管理器到底藏了多少秘密
- php获取curl头_php中CURL请求头和响应头获取方法
- oracle不能单步调试,oracle bug之vipca无法执行问题的解决
- 完整的OTT直播点播系统都有哪些功能?
- 12月5日 第二冲刺周期个人站立会议内容报告(第五天)
- mybatis关联配置(一对多配置)
- ThinkPHP5路由图解
- 异常:java.lang.IllegalArgumentException: Control character in cookie value or attribute.
- 微信公众平台帐号通过昵称无法搜索到怎么办