Hibernate创建相同的PK?

时间:2011-08-05 14:43:33

标签: hibernate spring

我有以下情况:假设我有一个实体“Event”,其中包含一组带有@OneToMany映射的“Place”实体对象。

@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。我期待在地方表中创建第二行,但事实并非如此。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

如果您尝试更换,该怎么办?

  @GeneratedValue(strategy=Generation.AUTO)

 @GeneratedValue(strategy=GenerationType.AUTO)

答案 1 :(得分:0)

如果某个事件可能发生在很多地方,则您需要在OneToManyEvent实体之间建立Place关联。使用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 Reference文档部分2.2.5. Mapping entity associations/relationship