-1

この悪名高いエラーが発生しています:

外部キー (FK69848D5097EB6FB4:DOCUMENT_HISTORY [VOTERDOC_ID])) には、参照される主キー (VOTER_DOCUMENT [VOTER_ID,ID]) と同じ数の列が必要です。

しかし、私は複合キーを使用していません。データベースで、関連する両方のテーブルの PK が VARCHAR である id フィールドであることを確認しました。そして、ここに私のエンティティがあります:

@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 には複合主キーがあると教えてくれますが、そうではありません。

何が問題なのですか?

* *UPDATED : 元の投稿を編集して、ゲッターとセッター (マークアップや注釈がない) を除いて、クラス全体を含めました。

不思議なことに、問題は消えたようです。(このクラスと他のクラスの) 注釈をコメントアウトしただけで、エラーは消えました。次に、コメントのコメントを外しましたが、うまくいきました!

理由はわかりませんが、ここでは一般的なファンキーさが起こっていると思います。

別のエラーが表示されましたが、同様にばかげています。単純なテーブルを使用:

  @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 は County FK です。Hibernate が不平を言っている理由がわかりません。残念ながら、今回はアノテーションをコメントしたりコメントを外したりするだけでは何も修正されません。これは当然のことです。

4

1 に答える 1

0

なぜこれが機能するのかはわかりませんが...

クラスに Serializable を実装し、生成された private static final long serialVersionUID を追加したところ、動作するようになりました。

なぜ..またはHibernateが私が複合キーを使用していると考えるのか、まだ理解できません...

于 2013-02-18T08:54:08.607 に答える