문제

누군가가 최대 절전 모드에서 단방향 @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

당신은 많은 사람들 매핑을 사용하는 것이 좋습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top