Hibernate создает тот же ПК? - PullRequest
       2

Hibernate создает тот же ПК?

0 голосов
/ 05 августа 2011

У меня следующая ситуация: скажем, у меня есть сущность «Событие», которая содержит набор объектов сущности «Поместить» с отображением @OneToMany.

@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 этого класса.

Я создаю (через свое веб-приложение) новое событие с местом и сохраняю. Как и ожидалось, в таблице событий и мест есть новая запись. Затем я создаю еще одно новое событие с тем же местом, что и первое событие. На этот раз, когда я пытаюсь сохранить, я получаю исключение NonUniqueObjectException. Первичный ключ первого места отмечается как проблема. Похоже, что "новый" идентификатор не создается для второго места. Другими словами, это повторное использование идентификатора. Я ожидаю создания второй строки в таблице мест, но это не так.

Есть мысли?

Ответы [ 2 ]

0 голосов
/ 05 августа 2011

Если событие может произойти во многих местах, вам понадобится OneToMany связь между Event и 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 2.2.5. Сопоставление сопоставлений сущностей / отношения для получения дополнительной информации об сопоставлении сопоставлений между сущностями.

0 голосов
/ 05 августа 2011

Что делать, если вы попытаетесь заменить:

  @GeneratedValue(strategy=Generation.AUTO)

с

 @GeneratedValue(strategy=GenerationType.AUTO)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...