我有以下情況:說我有一個實體「事件」,其中包含一組「實體對象」與@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。我期待在地點表中創建第二行,但事實並非如此。
有什麼想法?
「接下來,我創建了另一個與第一個事件相同的新事件」 - 這是什麼意思?向我們展示代碼以展示你在做什麼。 – skaffman
你在你的問題中自相矛盾:你首先說你創造了一個與同一個地方相同的新事件,然後說你期望創造第二個地方。告訴我們您要做什麼,並向我們展示執行此操作的代碼。 –
假設我創建了地點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