java - JPA - 2 个实体之间的 2 个 @ManyToMany 关系(其中一个带有额外的实体)
问题描述
我正在尝试解决 JPA 问题。我有 2 个主要实体 - CameraItem 和 Chain(代表相机的有序列表)
现在CameraItem 和Chain 之间必须有2 个@ManyToMany 关系。
每个 CameraItem 至少有一个父链。由于一个 CameraItem 可以属于不同的 Chain,并且每个 Chain 可以有多个 CameraItem,这是第一个简单的直接 @ManyToMany 关系。
链可以通过 CameraItem 相互连接。换句话说,CameraItem 持有链之间的连接。但这不是简单的@ManyToMany 关系,因为我们还需要有关 Chains 连接方向的信息。所以这是 @ManyToMany 与新实体的关系,正如 Baeldung 在这里描述的那样https://www.baeldung.com/jpa-many-to-many。实体 ConnectionPoint 将有关方向的信息保存为字符串。
我在这里粘贴类:
链类:
@Entity
@Table(name = "chain")
public class Chain {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@NotBlank(message = "Chain name is mandatory")
private String name;
@Column(name = "PLANT_NAME")
private String plantName;
private String description;
private String status;
private Boolean hasPlant;
@CreationTimestamp
@Column(name = "creation_time")
private LocalDateTime creationTime;
@OneToMany(mappedBy = "camera_item")
private List<CameraItem> cameraItems = new ArrayList<>();
@OneToMany(mappedBy = "chain")
Set<ConnectionPoint> connectionPoints;
相机项目类:
@Entity
@Table(name = "camera_item")
public class CameraItem {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@ManyToOne
@JoinColumn
private Camera camera;
private String name;
private Integer positionInChain;
@ManyToMany(mappedBy = "cameraItems", fetch = FetchType.LAZY)
private List<Chain> parentChainIds;
@OneToMany(mappedBy = "cameraItem")
Set<ConnectionPoint> connectionPoints;
连接点类:
@Entity
@Table(name = "connection_point")
public class ConnectionPoint {
@Id
private Long id;
@Column(name = "direction")
private String direction;
@ManyToOne
@JoinColumn(name = "chain")
private Chain chain;
@ManyToOne
@JoinColumn(name = "camera_item")
private CameraItem cameraItem;
当我运行应用程序时,我收到此错误:
org.hibernate.AnnotationException: mappedBy 引用未知目标实体属性: no.trafsys.videodashboard.model.entity.Chain.cameraItems 中的 no.trafsys.videodashboard.model.entity.CameraItem.camera_item
有人知道问题出在哪里吗?
我在 Chain 和 CameraItem 实体中使用 @OneToMany 注释,在 ConnectionPoint 中使用 @ManyToOne,就像他的教程中的 Baeldung 一样。
预先感谢您的任何帮助
解决方案
@Entity
@Table(name = "chain")
public class Chain {
//..
@OneToMany(mappedBy = "camera_item")
private List<CameraItem> cameraItems = new ArrayList<>();
//..
}
mappedBy
参数只能在关系的一侧。我怀疑camera_item
是数据库表列名。所以你的cameraItems
需求@JoinTable(name = "camera_item"...
注释
推荐阅读
- amazon-web-services - AWS 终端节点转发
- mariadb - 今天的最小日期时间
- sql - 选择双重分组后的最后一个值
- haskell - Haskell Parsec - 优化 int 解析
- python - 使用烧瓶渲染 html 找不到文件
- php - PHP 日期 - Unix 时间戳
- sql - 选择视图会导致 TDWM 错误。糟糕的解释计划?根本原因?
- node.js - 检测 NODE.JS 脚本是通过 bash (unix) / cmd (windows) 直接调用还是导入(ESM 模块加载器)
- docker - docker compose 如何在后台工作?
- c# - 如何将单击“是”的确认框传递给单独的视图模型?如何以 MVVM 方式显示对话框?