Hibernate создает дубликаты записей в базе данных - PullRequest
1 голос
/ 23 сентября 2010

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

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

Юниверс, Предметы, Персона, Ящик - все таблицы базы данных. Коробка похожа на таблицу соединений для Персона и Предметы.

Примечание. Я использую API сохраняемости javax и спящий режим

Теперь предмет можно создать во Вселенной и сохранить. Человек может иметь сущность в Ящике для этого Предмета и сохранять информацию для Человека. Это отлично работает.

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

Есть ли способ заставить Вселенную сохранить Предмет и заставить Человека ссылаться на него, используя аннотации в спящем режиме и 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;
    }
}

Ящик стола (соединительный стол):

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;

    ...

}

В таблице Вселенной есть множество предметов.

1 Ответ

1 голос
/ 23 сентября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...