Java 休眠具有相同名称的一对多JoinColumn
我有两个表,每个表有两列,如上所述。 我想在assignment实体中创建一个审阅列表,这些审阅在assignmentCode列中加入 在任务中,我定义如下:Java 休眠具有相同名称的一对多JoinColumn,java,hibernate,Java,Hibernate,我有两个表,每个表有两列,如上所述。 我想在assignment实体中创建一个审阅列表,这些审阅在assignmentCode列中加入 在任务中,我定义如下: Entity(name = "Assignment") class Assignment { @Id private int id; private String assignmentCode; } Entity(name = "Review") class Review { @Id private int id
Entity(name = "Assignment")
class Assignment {
@Id
private int id;
private String assignmentCode;
}
Entity(name = "Review")
class Review {
@Id
private int id;
private String assignmentCode;
}
@OneToMany(targetEntity=Review.class,fetch=FetchType.EAGER)
@JoinColumn(name=“assignmentCode”)
私有列表评论=新建ArrayList();
但是当我检索到Assignment=session.findById(Assignment.class,id)时;
我得到的异常是由以下原因引起的:com.microsoft.sqlserver.jdbc.SQLServerException:不明确的列名'assignmentCode'
定义评论集合的正确方法是什么?
我无法将表结构更改为具有不同的列名。您应该:
@OneToMany(targetEntity = Review.class, fetch=FetchType.EAGER)
@JoinColumn(name="assignmentCode")
private List<Review> reviews = new ArrayList<Review>();
@实体
@表(name=“分配”)
课堂作业{
@身份证
私有int-id;
@列(name=“分配\代码”)
私有字符串赋值码;
@OneToMany(targetEntity=Review.class,fetch=FetchType.EAGER)
@JoinColumn(name=“assignment\u code”,table=“review”)
私有列表评论=新建ArrayList();
}
@实体
@表(name=“review”)
课堂复习{
@身份证
私有int-id;
@列(name=“分配\代码”)
私有字符串赋值码;
}
看到您的错误消息,我相信这是因为您的列名称与Java变量名称不同,通常我会在数据库中将我的列命名为类似于assignment\u code
的名称,而此列是用于连接审阅和赋值的引用
我的第一个建议是,如果我对数据库列和Java变量之间不同命名的直觉正确,请将@column(name=“assignment\u code”)
置于私有字符串assignmentCode
之上
其次,我认为您在定义@OneToMany
关系时犯了错误。我将在作业
类中做类似的事情(我假设您希望从代码中看到单向的东西)
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY,orphanRemoving=true)
@JoinColumn(name=“分配\代码”)
私有列表评论=新建ArrayList();
提醒,在
@JoinColumn
上,名称是数据库上的引用列的名称,而不是Java变量名正确的解决方案是()
@实体(name=“分配”)
课堂作业{
@身份证
私有int-id;
私有字符串赋值码;
@OneToMany(mappedBy=“转让”)
私有列表评论=新建ArrayList();
公开审查(审查){
评论。添加(评论);
评论。setPost(本);
}
公共作废清除审查(审查){
审查。删除(审查);
reviews.setAssignment(null);
}
}
@实体(名称=“审查”)
课堂复习{
@身份证
私有int-id;
@manytone(fetch=FetchType.LAZY)
@连接柱(
name=“assignmentCode”,
referencedColumnName=“assignmentCode”
)
私人转让;
}
如果您定义@JoinColumn(name=“assignmentCode”,table=“your\u Review\u tableName\u here”),我正在处理现有数据库,因此无法更改列名,该怎么办。因此,我使用@Column(name=“assignmentCode”)并进行了这些更改。但是我得到了由以下原因引起的异常:org.hibernate.cfg.NotYetImplementedException:Collections在secondary table中有FK那么我需要查看您现有的数据库方案来帮助您。或者您可以根据您的方案自行更改批注中的名称(JoinColumn、Column、Table)。分配表:Columns:ID,AssignmentCode---Review表:Columns:ID,AssignmentCode尝试将审查字段替换为:@OneToMany(targetEntity=Review.class,fetch=FetchType.EAGER,mappedBy=“AssignmentCode”)私有列表评论=新建ArrayList();不。。。这再次给出了错误的模棱两可的列名'assignmentCode'Mine是一个现有的数据库。所以我不能更改列名
@Entity
@Table(name = "assignment")
class Assignment {
@Id
private int id;
@Column(name="assignment_code")
private String assignmentCode;
@OneToMany(targetEntity = Review.class, fetch=FetchType.EAGER)
@JoinColumn(name="assignment_code", table="review")
private List<Review> reviews = new ArrayList<Review>();
}
@Entity
@Table(name = "review")
class Review {
@Id
private int id;
@Column(name="assignment_code")
private String assignmentCode;
}
@OneToMany(cascade = CascadeType.ALL, fetch=FetchType.LAZY, orphanRemoval = true)
@JoinColumn(name="assignment_code")
private List<Review> reviews = new ArrayList<Review>();
@Entity(name = "Assignment")
class Assignment {
@Id
private int id;
private String assignmentCode;
@OneToMany(mappedBy = "assignment")
private List<Review> reviews = new ArrayList<Review>();
public void addReview(Review review) {
reviews.add(review);
reviews.setPost(this);
}
public void removeReview(Review review) {
reviews.remove(review);
reviews.setAssignment(null);
}
}
@Entity(name = "Review")
class Review {
@Id
private int id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(
name = "assignmentCode",
referencedColumnName = "assignmentCode"
)
private Assignment assignment;
}