Нужен пример сопоставления первичного ключа @OneToOne в Hibernate
-
10-07-2019 - |
Вопрос
Кто-нибудь может привести пример однонаправленного сопоставления первичного ключа @OneToOne в Hibernate? Я пробовал множество комбинаций, и пока лучшее, что я получил, это:
@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 пытается автоматически сгенерировать схему для вышеприведенного сопоставления, он пытается создать первичный ключ в виде большого двоичного объекта, а не в виде long, который является типом id PaperCheque. Может кто-нибудь, пожалуйста, помогите мне? Если я не смогу найти точное решение, подойдет что-то близкое, но я буду благодарен за любой ответ.
Решение
Ваше намерение состоит в том, чтобы иметь отношение 1-1 между PaperChequeStopMetaData и PaperCheque? Если это так, вы не можете определить экземпляр PaperCheque как @Id PaperChequeStopMetaData, вам нужно определить отдельный столбец @Id в PaperChequeStopMetaData.
Другие советы
Я сохранил это обсуждение , когда реализовал несколько сопоставлений @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 в hibernate, это очень опасно. см. http://opensource.atlassian.com/projects/hibernate/browse/HHH -2128 р>
вам лучше использовать сопоставления ManyToOne.