这里是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中实现复杂的多对多关系?相关推荐

  1. java实体外键_如何在JPA中添加用户实体和好友关系实体的外键

    现有用户实体,相关代码如下: @Entity @Table(name = "t_users") public class User extends Model { @Id @Col ...

  2. java如何设置1.5倍行距_Java如何在iText中设置段落行间距?

    要设置的行间距在iText的段落可以通过传递线空间/领先的参数进行Paragraph构造.在下面的示例中,我们将行距设置为32.我们还可以通过调用此对象的setSpacingBefore()和setS ...

  3. java多线程有几种实现方法_Java多线程之间实现通讯

    一.课程目标 多线程之间如何通讯 wait.notify.notifyAll()方法 lock 停止线程 守护线程 Join方法 优先级 Yield 二.多线程之间如何实现通讯 2.1 什么是多线程之 ...

  4. java多线程同步的四种方法_java中实现多线程的两种方法

    java多线程有几种实现方法,都是什么?同步有几种实java中多线程的实现方法有两种:1.直接继承thread类:2.实现runnable接口:同步的实现方法有五种:1.同步方法:2.同步代码块:3. ...

  5. java 集合遍有几种方法_Java 集合遍历的几种方法

    以下实例演示了如何遍历从Collection接口延伸出的List.Set和以键值对形式作存储的Map类型的集合,以下我们分别使用了普通for,增强型的 for ,iterator 等方式来遍历集合: ...

  6. java如何使显示字符下标_Java如何在 Word 中设置上、下标

    上标是指比同一行中其他文字稍高的文字,而下标是指比同一行中其他文字稍低的文字.在生活中,我们常见的平方米.立方米等符号以及化学中的各种元素符号,都是利用上.下标来表示的.本文将介绍通过Free Spi ...

  7. java如何实取随机数_java - 如何在Kotlin中获取随机数?

    java - 如何在Kotlin中获取随机数? 可以在2个参数之间返回随机整数的通用方法,如ruby,可以使用rand(0..n). 有什么建议吗? 16个解决方案 208 votes 我的建议是In ...

  8. java for 下标_Java如何在 Word 中设置上、下标

    上标是指比同一行中其他文字稍高的文字,而下标是指比同一行中其他文字稍低的文字.在生活中,我们常见的平方米.立方米等符号以及化学中的各种元素符号,都是利用上.下标来表示的.本文将介绍通过Free Spi ...

  9. java搜索excel表格里的数据_Java读取Excel表格中的数据

    前言 本文主要讲述如何在Java中读取Excel表中的数据并在控制台输出,实现工具为Eclipse 提示:以下是本篇文章正文内容,下面案例可供参考 一.添加jar包文件 描述:在Java中导入导出Ex ...

最新文章

  1. 【iOS官方文档翻译】iOS的蓝牙连接、数据接收及发送
  2. Oracle体系结构之密码文件管理
  3. python --闭包学习
  4. wxWidgets:wxPython 概述
  5. python高并发架构_python高并发的解决方案
  6. eclipse配置项目部署到到本地tomcat
  7. php算法求出一个数可以被分解成多少个_小学数学必考的34个数学重难点公式,赶紧给孩子收藏!...
  8. 小李飞刀:SQL题目刷起来!
  9. Security+ 学习笔记33 主机安全
  10. stella forum 知识库---一些错误的修补
  11. java模拟洗衣机程序,JAVA洗衣机仿真程序实验报告及代码
  12. C语言--16进制转字符串
  13. java 打印request的原始请求数据
  14. linux realtek声卡驱动下载,一步一步安装Realtek ALC888、ALC1200 声卡(附Realtek ALC888 ALC1200驱动)...
  15. 0x0000006B蓝屏问题解决方法
  16. 活化脂修饰NOTA,NOTA-NHS ester,CAS:1338231-09-6
  17. 计算机重做系统有什么好处,电脑卡重装系统有用吗|电脑太卡可以重装系统解决吗...
  18. 能测试快充真假的软件,苹果iOS 12可自行测试真假快充:山寨充电器无处遁形
  19. 只需 2 张照片就能 2D 变 3D,这个 AI 能自己脑补蜡烛吹灭过程
  20. 【欧拉计划第 5 题】最小公倍数 Smallest multiple

热门文章

  1. java序列化异常_Java|序列化异常StreamCorruptedException的解决方法
  2. win10任务管理器快捷键_你都知道吗?Win10任务管理器到底藏了多少秘密
  3. php获取curl头_php中CURL请求头和响应头获取方法
  4. oracle不能单步调试,oracle bug之vipca无法执行问题的解决
  5. 完整的OTT直播点播系统都有哪些功能?
  6. 12月5日 第二冲刺周期个人站立会议内容报告(第五天)
  7. mybatis关联配置(一对多配置)
  8. ThinkPHP5路由图解
  9. 异常:java.lang.IllegalArgumentException: Control character in cookie value or attribute.
  10. 微信公众平台帐号通过昵称无法搜索到怎么办