최대 절전 모드에서 1 차 키 @onetoone 매핑의 예가 필요합니다.
-
10-07-2019 - |
문제
누군가가 최대 절전 모드에서 단방향 @onetoone 1 차 키 매핑의 예를 알려 주시겠습니까? 나는 수많은 조합을 시도했고 지금까지 내가 얻은 가장 좋은 것은 다음과 같습니다.
@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 매핑을 구현했을 때, 그것이 당신에게도 사용할 수 있기를 바랍니다. 그러나 우리는 최대 절전 모드가 우리를 위해 데이터베이스를 만들지 못하게합니다.
제네릭 게이터 주석에 유의하십시오.
어쨌든이 코드가 작동합니다.
@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 Property Accessor는 정상적입니다 (표시되지 않음). 나는 이런 종류의 단방향 onetoone 매핑 문제를 해결하고 훨씬 더 나쁜 솔루션을 위해 해결했지만 이번에는 알아 내려고 결정하기로 결정했기 때문에 계속 해킹을했습니다. 다시 한번, 여러분의 답변에 감사드립니다. 대단히 감사합니다.
미래의 견해를 위해이 질문을 업데이트합니다.
이 질문이 만들어 졌을 때 나는이 문제에 대한 적절한 해결책이 없다고 생각합니다. 그러나 JPA 2.0이므로 @mapsid를 사용 하여이 문제를 해결할 수 있습니다.
적절한 설명과 함께 참조 : https://vladmihalcea.com/the-best-way-to-map-a-onetoone-relationship-with-jpa-and-hibernate/
Hibernate의 Onetoone 매핑에서 멀리 떨어져 있어야합니다. 매우 위험합니다. 보다 http://opensource.atlassian.com/projects/hibernate/browse/hhh-2128
당신은 많은 사람들 매핑을 사용하는 것이 좋습니다.