2011-08-05 41 views
0

我有以下情況:說我有一個實體「事件」,其中包含一組「實體對象」與@OneToMany映射。Hibernate創建相同的PK?

@Entity 
public class Event { 

    @Id 
    @GeneratedValue(strategy=Generation.AUTO) 
    @JoinColumn 
    private Long id = 0L; 

    @OneToMany(cascade=CascadeType.ALL, fetch=Fetch.EAGER) 
    @JoinColumn(name="event_id")  
    @org.hibernate.annotations.Cascade (value=org.hibernate.annotations.CascadeType.DELETE_ORPHAN) 
    private Set<Place> places = new HashSet<Place>(); 
} 

@Entity 
public class Place { 

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

    private String name; 

    private Long placeId = 0L; 
} 

我也使用Spring 3.X運行並使用AnnotationSessionFactoryBean作爲會話工廠。這兩個實體都在此類的annotatedClasses屬性中正確列出。

我創建(通過我的Web應用程序)一個新的事件與地方和保存。如預期的那樣,Event和Place表中都有一個新條目。接下來,我會創建與第一個活動相同地點的另一個新活動。這次當我試圖保存時,我得到一個NonUniqueObjectException。第一位的主要關鍵是被注意到的問題。看起來,第二個地方沒有創建「新」ID。換句話說,它正在重用這個ID。我期待在地點表中創建第二行,但事實並非如此。

有什麼想法?

+0

「接下來,我創建了另一個與第一個事件相同的新事件」 - 這是什麼意思?向我們展示代碼以展示你在做什麼。 – skaffman

+0

你在你的問題中自相矛盾:你首先說你創造了一個與同一個地方相同的新事件,然後說你期望創造第二個地方。告訴我們您要做什麼,並向我們展示執行此操作的代碼。 –

+0

假設我創建了地點1的活動#1。接下來,我創建了地點1的活動#2。我期望在第一個事件創建時在我的數據庫中有以下內容:在事件表中,一行id = 1,place table中一行id = 1,event_id = 1。創建第二個事件後,我期望以下在DB中:事件表中的兩行,一個id = 1,另一個id = 2和2行,id = 1和event_id = 1,第二個id = 2,event_id = 2。我真的在這裏簡化了對象,因爲我不能在這裏放置「完整」對象。 – wxkevin

回答

0

如果你嘗試更換:

@GeneratedValue(strategy=Generation.AUTO) 

@GeneratedValue(strategy=GenerationType.AUTO) 
+0

它實際上是GenerationType.AUTO。我輸錯了。我會解決這個問題。謝謝! – wxkevin

0

如果可以在許多地方發生的事件,您將需要EventPlace實體之間的OneToMany關聯。與OneToMany協會不能重複使用Place之間Event 您將不得不使用ManyToMany協會來做到這一點。

標準OneToMany雙向關聯。

@Entity 
    public class Event 
    { 

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

     @OneToMany(mappedBy="event", orphanRemoval=true, cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
     private Set<Place> places = new HashSet<Place>(); 
    } 

    @Entity 
    public class Place 
    { 
     @Id 
     @GeneratedValue(strategy = GenerationType.AUTO) 
     private Long id; 

     private String name; 

     @ManyToOne 
     @JoinColumn(name="event_id") 
     private Event event; 

    } 
... 
    //create event#1 and a place #1Event event1 = new Event(); 
    Place place1 = new Place(); 
    event1.getPlaces().add(place1); 
    place1.setEvent(event1); 
    entitymanager.persist(event1); 


    //create event#2 and place #2 and place #3 
    Event event2 = new Event(); 
    Place place2 = new Place(); 
    Place place3 = new Place(); 

    event2.getPlaces().add(place2); 
    place1.setEvent(event2); 
    event2.getPlaces().add(place3); 
    place3.setEvent(event2); 
    entitymanager.persist(event2); 

參考Hibernate參考文檔部分2.2.5. Mapping entity associations/relationship用於在實體之間映射關聯的詳細信息。