2013-08-19 14 views
5

Mam dwa elementy: Document i BodyElement i próbuję je zachować przy użyciu Hibernuj 4.2. mtdt_t zapełnia się poprawnie, ale klucz obcy docid w tabeli mtdt_body_t to NULL.Pole klucza obcego puste w odwzorowaniu @OneToOne z Hibernate/JPA

Widzę, że hibernacja próbuje wstawić wartość bez wartości 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; 
    } 

} 

Opuściłem inne pole. W Document mam,

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

w klasie Keyword Mam klucz obcy odwzorowaną jak

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

i że docid pole nigdy nie jest NULL.

Czy jest coś szczególnego w mapowaniu @OneToOne w porównaniu do @OneToMany? Po prostu naśladowałem to, co zrobiłem dla @OneToMany w polu @OneToOne.

Dzięki

Odpowiedz

0
  1. OrderColumn Adnotacja jest określona w stosunku OneToMany lub ManyToMany lub na zbiorze elementu. Adnotacja OrderColumn jest określona z boku relacji, która odwołuje się do kolekcji, która ma zostać zamówiona. Kolumna zamówienia nie jest widoczna jako część stanu encji lub klasy embedable. link to documentation

  2. Masz błąd w odwzorowywaniu. Zapomniałeś o atrybucie mappedBy. Oznacza to, że ta relacja między obiektami została już zmapowana, więc nie robisz tego dwa razy. Po prostu mówisz "Hej, to jest zrobione tam", używając atrybutu mappedBy (following by this post). I tutaj jest użyteczny przykład: Hibernate – One-To-One Example (Annotation)

+0

Podążyłem za przykładem mkyonga za pomocą 'mappedBy', ale nadal pozostawił on pole' docid'. Tym razem kolumna 'docid' nie była nawet obecna. – wsams