Domanda

Qualcuno può darmi un esempio di un mapping unidirezionale a chiave primaria @OneToOne in Hibernate? Ho provato numerose combinazioni e finora la cosa migliore che ho ottenuto è questa:

@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;
}

Ogni volta che Hibernate tenta di generare automaticamente lo schema per il mapping sopra, tenta di creare la chiave primaria come BLOB, anziché come long, che è il tipo ID di PaperCheque. Qualcuno può aiutarmi per favore? Se non riesco a ottenere una soluzione esatta, farebbe qualcosa di simile, ma apprezzerei qualsiasi risposta.

È stato utile?

Soluzione

La tua intenzione è quella di avere una relazione 1-1 tra PaperChequeStopMetaData e PaperCheque? In tal caso, non è possibile definire l'istanza PaperCheque come @Id di PaperChequeStopMetaData, è necessario definire una colonna @Id separata in PaperChequeStopMetaData.

Altri suggerimenti

Ho salvato questa discussione quando ho implementato un paio di mappature @OneToOne , Spero che possa essere utile anche a te, ma non permettiamo a Hibernate di creare il database per noi.

Nota l'annotazione GenericGenerator.

Comunque, ho questo codice funzionante:

@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;
    }
}

Grazie ad entrambi per le risposte. Ho continuato a sperimentare, ed ecco cosa ho lavorato:

@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
}
}

Questo è sicuramente un trucco disgustoso, ma mi dà tutto ciò che volevo. Gli accessi alle proprietà di paperCheque sono normali (non mostrati). Mi sono imbattuto in questo tipo di problema di mappatura unidirezionale di OneToOne in precedenza e ho risolto soluzioni molto peggiori, ma questa volta ho deciso che avrei capito, quindi ho continuato a smanettarlo. Ancora una volta, grazie ad entrambi per le risposte, è molto apprezzato.

Sto solo aggiornando questa domanda per visualizzazioni future.

Quando è stata posta questa domanda, penso che non ci fosse una soluzione adeguata a questo problema. Ma da JPA 2.0 puoi usare @MapsId per risolvere questo problema.

Riferimento con spiegazione corretta: https://vladmihalcea.com/the-best-way-to-map-a-onetoone-relationship-with-jpa-and-hibernate/

Dovresti stare lontano dalla mappatura OneToOne di ibernazione, è molto pericoloso. vedi http://opensource.atlassian.com/projects/hibernate/browse/HHH -2128

stai meglio usando le mappature ManyToOne.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top