2013-08-19 16 views
5

Ho due entità, Document e BodyElement e cerco di persisterli con Hibernate 4.2. mtdt_t popola correttamente, ma la chiave esterna docid nella tabella mtdt_body_t è NULL.Campo chiave esterna null nel mapping @OneToOne con Hibernate/JPA

Vedo che l'ibernazione tenta di inserire senza il valore docid. insert into mtdt_body_t values ()

@Entity 
@Table(name = "mtdt_t") 
public class Document implements Serializable { 

    @Id 
    @Column(name = "docid", unique = true, nullable = false) 
    private String docid; 

    @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER) 
    @OrderColumn 
    @JoinColumn(name = "docid", nullable = false) 
    private BodyElement bodyElement; 

    public String getDocid() { 
     return docid; 
    } 

    public void setDocid(String docid) { 
     this.docid = docid; 
    } 

    public BodyElement getBodyElement() { 
     return bodyElement; 
    } 

    public void setBodyElement(BodyElement bodyElement) { 
     this.bodyElement = bodyElement; 
    } 

} 

@Entity 
@Table(name = "mtdt_body_t") 
public class BodyElement implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @OneToOne 
    @JoinColumn(name = "docid", insertable = false, updatable = false, nullable = false) 
    private Document document; 

    public BodyElement() { 
    } 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public Document getDocument() { 
     return document; 
    } 

    public void setDocument(Document document) { 
     this.document = document; 
    } 

} 

Ho interrotto un altro campo. In Document ho,

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER) 
@OrderColumn 
@JoinColumn(name = "docid", nullable = false) 
@XmlPath("head/meta/kb:keywords/kb:keyword") 
private Set<Keyword> keywords; 

Nella classe Keyword ho la chiave esterna mappata come,

@ManyToOne 
@JoinColumn(name = "docid", insertable = false, updatable = false, nullable = false) 
@XmlTransient 
private Document document; 

e che docid campo non è mai NULL.

C'è qualcosa di speciale nella mappatura @OneToOne rispetto a @OneToMany? Ho appena imitato quello che avevo fatto per @OneToMany nel campo @OneToOne.

Grazie

risposta

0
  1. L'annotazione OrderColumn è specificato su un rapporto OneToMany o ManyToMany o su un elemento di raccolta. L'annotazione OrderColumn è specificata sul lato della relazione che fa riferimento alla raccolta che deve essere ordinata. La colonna dell'ordine non è visibile come parte dello stato dell'entità o della classe incorporabile. link to documentation

  2. Errore nella mappatura. Hai dimenticato l'attributo mappedBy. Significa che quella relazione tra le entrate è già stata mappata, quindi non lo fai due volte. Dici solo "Ehi è fatto laggiù" usando l'attributo mappedBy (following by this post). Ed ecco un esempio utile: Hibernate – One-To-One Example (Annotation)

+0

Ho seguito l'esempio di mkyong usando 'mappedBy', ma rimaneva comunque fuori dal campo' docid'. Questa volta la colonna 'docid' non era nemmeno presente. – wsams

Problemi correlati