java - 如何与hibernate建立1:n关系?
问题描述
我正在使用hibernate来表示具有三个主要实体用户、项目和评论的数据库。用户和项目继承自基类。该项目还拥有无限量的评论。在 POJO 中,我尝试用List<Comment>
.
我的主要问题是,当我去拿一个在列表中包含许多评论引用的项目时,java 会抛出一个 IllegalArgumentException 说它无法访问评论的 id 字段,因为它只获得一个 ArrayList。
Caused by: java.lang.IllegalArgumentException: Can not set int field com.project.objects.Comment.id to java.util.ArrayList
我的课程如下 - 没有 Constructor/Setter/Getter,因为它们很简单:
@MappedSuperclass
public abstract class Base {
@Id
@Column
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column
private String name;
@Column
private String longDesc;
@Column
private String briefDesc;
@Column
@ElementCollection(targetClass=String.class)
private List<String> goals;
@Column
private String picture;
@Column
private int cType;
@Entity(name = "Project")
@Table(name = "project")
public class Project extends Base {
@Column
private String start;
@Column
private String end;
@Column
private String manager;
@ElementCollection(targetClass=Comment.class)
@ManyToOne(targetEntity = Comment.class, fetch = FetchType.EAGER)
@JoinColumn(name = "comment_id")
private List<Comment> comments;
@Entity(name = "Comment")
@Table(name = "comment")
public class Comment {
@Id
@Column(name="comment_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column
private String comment;
@Column
private int rating;
@Column
private int pcuser;
@Column
private int cType;
解决方案
您的 1:N 关联是错误的,因为它现在实际上是 N:1。正确的是:
Entity(name = "Project")
@Table(name = "project")
public class Project extends Base {
@Column
private String start;
@Column
private String end;
@Column
private String manager;
@OneToMany(mappedBy = "project", fetch = FetchType.EAGER)
private List<Comment> comments;
在你的Comment
课堂上:
@Entity(name = "Comment")
@Table(name = "comment")
public class Comment {
@Id
@Column(name="comment_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column
private String comment;
@Column
private int rating;
@Column
private int pcuser;
@Column
private int cType;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "id_project", nullable = false)
private Project project;
// THIS is the required and obrigatory mapping that you forgot.
// It's the foreing key itself
免责声明
我以前从未真正使用过带有继承的 Hibernate(通常,它对于关系数据库来说非常复杂且效率低下),但请查看“https://www.baeldung.com/hibernate-inheritance”和“https://marcin-chwedczuk” .github.io/mapping-inheritance-in-hibernate`了解更多信息。推荐阅读
- powershell - 如何在 Powershell Menu 中创建 Menu 洞察力
- excel - excel统计出现或延迟值
- c - 用 C 读写文件
- swift - IBOutlet 在 IBDesignable 类中为零
- c# - 调用服务失败。
- mysql - MySQL 8.0 'C:\Program Files\MySQL\MySQL Server 8.0\data\' (OS errno 2 - 没有这样的文件或目录) - 无法从 cmd 找到 db 的数据
- vba - 使用 VBA 获取 SharePoint 文档库记录
- c# - 保存 Outlook.MailItem 异步?
- mysql - 从布尔字段 = false 的数据库中选择
- java - 如何识别另一个图像中的图像?