我收到了这个臭名昭著的错误:
外键 (FK69848D5097EB6FB4:DOCUMENT_HISTORY [VOTERDOC_ID]) 的列数必须与引用的主键 (VOTER_DOCUMENT [VOTER_ID,ID]) 的列数相同
但我没有使用复合键。我已经确认在数据库中,所涉及的两个表的 PK 都是 id 字段,即 VARCHAR。这是我的实体:
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
@Table(name = "VOTER_DOCUMENT")
public class VoterDocument {
@Id
@Column(length = 45, name = "ID")
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid")
private String id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "DOCTYPE_ID", nullable = false)
private DocumentType documentType;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "VOTER_ID", referencedColumnName = "ID", nullable = false)
private Voter voter;
@OneToMany(mappedBy = "voterDocument", fetch = FetchType.EAGER)
private final List<DocumentHistory> history =
new ArrayList<DocumentHistory>();
@OneToMany(mappedBy = "voterDocument", fetch = FetchType.EAGER)
private final List<VoterFile> files = new ArrayList<VoterFile>();
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
@Table(name = "DOCUMENT_HISTORY")
public class DocumentHistory {
@Id
@Column(length = 45, name = "ID")
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid")
private String id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "VOTERDOC_ID", referencedColumnName = "ID", nullable = false)
private VoterDocument voterDocument;
这似乎是一个简单的 OneToMany 映射,但它不起作用。但它并没有以最奇怪的方式工作,告诉我 VoterDocument 有一个复合主键,但事实并非如此。
可能是什么问题呢?
* *更新:我编辑了我的原始帖子以包括整个班级,除了 getter 和 setter(没有标记或注释)。
奇怪的是,问题似乎消失了。我只是注释掉了注释(在这个类和其他类中),错误就消失了。然后我取消评论评论,它的工作原理!
我认为这里有一些普遍的时髦,不知道为什么。
现在又出现了另一个错误,同样荒谬。用一个简单的表:
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
@Table(name = "ACTIVE_ELECTION")
public class ActiveElectionForCounty {
@Id
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "COUNTY_ID")
private County county;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "ELECTION_EVENT_ID")
private ElectionEvent electionEvent;
该表的 PK 是COUNTY_ID
County 表中的字段。我得到的错误是:
MappingException:复合 id 类必须实现 Serializable:ActiveElectionForCounty
再次使用复合键!但是该表没有复合键!最后一个也没有!它的PK是县FK。我不明白为什么 Hibernate 会抱怨。不幸的是,这一次简单地注释和取消注释注释并不能解决任何问题,这当然是正常的。