我刚刚重构了一个项目,使用带有继承的Hibernate(4.2.4。Final)。但我在ManyToMany注释方面遇到了麻烦。
我有一个像这样的基本文件类:
@Entity
@Table(name = "file")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "descriminator", length = 25)
public abstract class File {
@Id
@Column(name = "id", unique = true, nullable = false, length = 256)
private String id;
}
和一个特殊的继承类:
@Entity
@DiscriminatorValue("ISSUE_HISTORY_ATTACHMENT")
@Data
public class IssueHistoryAttachment extends File {
@ManyToOne(fetch = FetchType.LAZY)
@JoinTable(name = "issue_history_attachment", joinColumns = {
@JoinColumn(name = "attachment_id", nullable = false, unique = true) }, inverseJoinColumns = {
@JoinColumn(name = "issue_history_id", nullable = false)})
private IssueHistory history;
}
这个IssueHistoryAttachment类也在我的IssueHistory类中被引用。
@Entity
@Table(name = "issue_history")
@TableGenerator(name="tg", table="hibernate_sequences",pkColumnName="sequence_name", valueColumnName="sequence_next_hi_value", allocationSize=1)
public class IssueHistory implements java.io.Serializable {
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "tg")
@Column(name = "id", unique = true, nullable = false)
private int id;
// some other fields
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "issue_history_attachment", joinColumns = {
@JoinColumn(name = "issue_history_id", nullable = false)
}, inverseJoinColumns = {
@JoinColumn(name = "attachment_id", nullable = false, unique = true)
})
private Set<IssueHistoryAttachment> attachments = new HashSet<IssueHistoryAttachment>();
}
当我现在存储一个带有两个附件的IssueHistory实例时,所有这些字段都会正确地保存在我的数据库中。
我在文件表中得到了两个新条目,在*issue_history*表中得到一个新条目和在关系表*issue_history_attach*中得到两个正确条目。
所以在这一点上,所有的想法看起来都很好。但是,当我尝试读取IssueHistory实例中的Values Attachment Set时,只包含一个元素,而不是像存储在数据库中那样包含两个。
如何解决这个问题有什么建议吗?
我刚刚找到了问题的根源。
它是一个丢失/错误的equals方法。:-)
我不能评论是,所以我必须做出回答。
我在你的代码中看到一个问题(或者可能我不理解):
在IssueHistory
中,您使用的是@ManyToMany
到IssueHistoryAttachment
,但在IssueHistoryAttachment
中,您正在使用@ManyToOne
。
在我看来,这就是你问题的原因。