Hibernateの主キー@OneToOneマッピングの例が必要
-
10-07-2019 - |
質問
誰かがHibernateでの一方向の@OneToOne主キーマッピングの例を教えてもらえますか?私は数多くの組み合わせを試しましたが、これまでのところ私が得た最高のものはこれです:
@Entity
@Table(name = "paper_cheque_stop_metadata")
@org.hibernate.annotations.Entity(mutable = false)
public class PaperChequeStopMetadata implements Serializable, SecurityEventAware {
private static final long serialVersionUID = 1L;
@Id
@JoinColumn(name = "paper_cheque_id")
@OneToOne(cascade = {}, fetch = FetchType.EAGER, optional = false, targetEntity = PaperCheque.class)
private PaperCheque paperCheque;
}
Hibernateは上記のマッピングのスキーマを自動的に生成しようとするたびに、PaperChequeのidタイプであるlongとしてではなく、blobとして主キーを作成しようとします。誰か助けてくれますか?正確な解決策が得られない場合は、近いもので対応できますが、ご意見をお寄せください。
解決
あなたの意図は、PaperChequeStopMetaDataとPaperChequeの間に1-1の関係を持たせることですか?その場合、PaperChequeインスタンスをPaperChequeStopMetaDataの@Idとして定義することはできません。PaperChequeStopMetaDataに別の@Id列を定義する必要があります。
他のヒント
いくつかの@OneToOneマッピングを実装したときにこのディスカッションを保存しました、それがあなたにも役立つことを願っていますが、Hibernateにデータベースを作成させません。
GenericGeneratorアノテーションに注意してください。
とにかく、このコードは動作しています:
@Entity
@Table(name = "message")
public class Message implements java.io.Serializable
{
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@PrimaryKeyJoinColumn(name = "id", referencedColumnName = "message_id")
public MessageContent getMessageContent()
{
return messageContent;
}
}
@Entity
@Table(name = "message_content")
@GenericGenerator(name = "MessageContent", strategy = "foreign",
parameters =
{
@org.hibernate.annotations.Parameter
(
name = "property", value = "message"
)
}
)
public class MessageContent implements java.io.Serializable
{
@Id
@Column(name = "message_id", unique = true, nullable = false)
// See http://forum.hibernate.org/viewtopic.php?p=2381079
@GeneratedValue(generator = "MessageContent")
public Integer getMessageId()
{
return this.messageId;
}
}
ご回答いただきありがとうございます。私は実験を続けました、そして、ここに私が働いたものがあります:
@Entity
@Table(name = "paper_cheque_stop_metadata")
@org.hibernate.annotations.Entity(mutable = false)
public class PaperChequeStopMetadata implements Serializable, SecurityEventAware {
private static final long serialVersionUID = 1L;
@SuppressWarnings("unused")
@Id
@Column(name = "paper_cheque_id")
@AccessType("property")
private long id;
@OneToOne(cascade = {}, fetch = FetchType.EAGER, optional = false, targetEntity = PaperCheque.class)
@PrimaryKeyJoinColumn(name = "paper_cheque_id")
@JoinColumn(name = "paper_cheque_id", insertable = true)
@NotNull
private PaperCheque paperCheque;
@XmlAttribute(namespace = XMLNS, name = "paper-cheque-id", required = true)
public final long getId() {
return this.paperCheque.getId();
}
public final void setId(long id) {
//this.id = id;
//NOOP, this is essentially a pseudo-property
}
}
これは、どうしても嫌なハックですが、私が欲しかったものすべてを手に入れることができます。 paperChequeプロパティアクセサーは通常どおりです(表示されていません)。この種の単方向OneToOneマッピングの問題に以前遭遇し、さらに悪い解決策に落ち着きましたが、今回は私が理解しようと決めたので、それをハッキングし続けました。もう一度、あなたの答えに感謝します、それは大歓迎です。
今後の視聴のためにこの質問を更新するだけです。
この質問がなされたとき、この問題に対する適切な解決策はなかったと思います。しかし、JPA 2.0以降では、@ MapsIdを使用してこの問題を解決できます。
適切な説明付きのリファレンス: https://vladmihalcea.com/the-best-way-to-map-a-onetoone-relationship-with-jpa-and-hibernate/
休止状態のOneToOneマッピングには近づかないでください。非常に危険です。 http://opensource.atlassian.com/projects/hibernate/browse/HHHを参照してください。 -2128
ManyToOneマッピングを使用した方が良いです。