-1

我收到了这个臭名昭著的错误:

外键 (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_IDCounty 表中的字段。我得到的错误是:

MappingException:复合 id 类必须实现 Serializable:ActiveElectionForCounty

再次使用复合键!但是该表没有复合键!最后一个也没有!它的PK是县FK。我不明白为什么 Hibernate 会抱怨。不幸的是,这一次简单地注释和取消注释注释并不能解决任何问题,这当然是正常的。

4

1 回答 1

0

不知道为什么这有效,但......

我让我的类实现了 Serializable,添加了一个生成的私有静态 final long serialVersionUID,现在它可以工作了。

仍然不明白为什么..或者为什么 Hibernate 认为我正在使用复合键...

于 2013-02-18T08:54:08.607 回答