2010-09-23 3 views
1

У меня есть структура базы данных, которая похожа на описанную ниже.Hibernate создает дубликаты записей в базе данных

«Вселенная» может содержать любое количество «предметов». «Человек» может иметь «ящик», который относится к одному или нескольким «предметам» в «Вселенной»

Все объекты, элементы, личность, ящик - все таблицы базы данных. Коробка подобна таблице соединения для Person и Items.

Примечание: Я использую javax Persistence API и зимуют

Теперь элемент может быть создан во Вселенной и спасти. Человек может иметь объект в поле для этого элемента и сохранять информацию для Лица. Это прекрасно работает.

Но мое приложение желает создать Предмет во Вселенной, но не сохраняет его немедленно. Теперь я имею в виду попытку связать этот элемент с Лицом. У меня есть полный метод сохранения, который пытается сохранить все содержимое транзакции. Вызывая этот метод, я получаю две записи в таблице Items для одного и того же элемента, один из которых передается Лицом, а другой - Вселенной.

Есть ли способ, чтобы Вселенная сохранила Предмет и заставила Лица ссылаться на этот элемент с помощью аннотаций спящего режима и JPA.

Любые идеи приветствуются.

Не подходит для редактирования кода. Пожалуйста, несите меня.

Класс Person:

@Entity 
@Table(name = "Person") 
@Inheritance(strategy = InheritanceType.JOINED) 
public class Person 
{ 

    private Integer myId; 
    private String myName; 
    private String Occupation; 

    /** 
    * Set of Items. 
    */ 
    private Set<Items> myItems = new HashSet<Items>(); 

    @OneToMany 
    @JoinTable(name="Box", 
     joinColumns = @JoinColumn(name="person_id"), 
     inverseJoinColumns = @JoinColumn(name="item_id")) 
    @Cascade(value = {org.hibernate.annotations.CascadeType.DELETE_ORPHAN, 
        org.hibernate.annotations.CascadeType.ALL}) 

    private Set<Items> getItems() 
    { 
     return myItems; 
    } 
} 

В таблице Box (джойн стол):

create table Box(
    person_id int references Person(id) not null, 
    item_id int references Item(id) not null 
) 

Элементы, класс:

@Entity 
@Table(name = "Items") 
@Inheritance(strategy = InheritanceType.JOINED) 

public class Items 
{ 
    /** 
    * Database identifier. 
    */ 
    private Integer myDbId; 

    ... 

} 

В таблице Вселенная имеет один ко многим набор элементов.

+0

отправьте свой код –

+0

, вы знаете, мы программисты, поэтому показ вашего кода должен;) – Bozho

+0

Вы, по-видимому, смешиваете аннотации hibernate и jpa. Это не может/не должно работать. –

ответ

1

Это большой выстрел в темноте: используйте EntityManager#merge. Если вы хотите получить более точный ответ, добавьте больше деталей к вопросу.