Question

Quelqu'un peut-il me donner un exemple de mappage de clé primaire @OneToOne unidirectionnel dans Hibernate? J'ai essayé de nombreuses combinaisons et jusqu'à présent, la meilleure chose que j'ai obtenue est la suivante:

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

Chaque fois que Hibernate essaie de générer automatiquement le schéma pour le mappage ci-dessus, il essaie de créer la clé primaire sous la forme d'un blob, au lieu d'un long, qui est le type id de PaperCheque. Quelqu'un peut-il m'aider s'il vous plaît? Si je ne peux pas obtenir une solution exacte, quelque chose de proche ferait l'affaire, mais j'apprécierais toute réponse.

Était-ce utile?

La solution

Votre intention est d’avoir une relation 1-1 entre PaperChequeStopMetaData et PaperCheque? Si tel est le cas, vous ne pouvez pas définir l'instance PaperCheque en tant que @Id de PaperChequeStopMetaData, vous devez définir une colonne @Id distincte dans PaperChequeStopMetaData.

Autres conseils

J'ai enregistré cette discussion lorsque j'ai mis en œuvre deux mappages @OneToOne. J'espère que cela vous sera utile, mais nous ne laissons pas Hibernate créer la base de données pour nous.

Notez l'annotation GenericGenerator.

Quoi qu'il en soit, ce code fonctionne:

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

Merci à vous deux pour vos réponses. J'ai continué à expérimenter et voici ce que j'ai obtenu:

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

Ceci est, bien sûr, un hack dégoûtant, mais il me procure tout ce que je voulais. Les accesseurs de la propriété paperCheque sont comme d'habitude (non représentés). J'ai déjà rencontré ce type de problème de cartographie unidirectionnel OneToOne et je me suis contenté de solutions bien pires, mais cette fois-ci, j'ai décidé de résoudre le problème. Encore une fois, merci à vous deux pour vos réponses, c’est très apprécié.

Il suffit de mettre à jour cette question pour les vues futures.

Quand cette question a été posée, je pense qu’il n’existait pas de solution adéquate à ce problème. Mais depuis JPA 2.0, vous pouvez utiliser @MapsId pour résoudre ce problème.

Référence avec explication appropriée: https://vladmihalcea.com/the-best-way-to-map-a-ononone-relationship-with-jpa-and-hibernate/

Vous devriez rester à l’écart de la cartographie OneToOne d’Hibernate, elle est très dangereuse. voir http://opensource.atlassian.com/projects/hibernate/browse/HHH -2128

Mieux vaut utiliser les mappages ManyToOne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top