Необходимо ли вызывать flush() (интерфейс JPA) в этой ситуации?

StackOverflow https://stackoverflow.com/questions/949427

Вопрос

Потому что вызов flush() для получения сохранения всех объектов из памяти в базу данных.Поэтому, если я использую call too much ненужный flush(), это может занять много времени, поэтому не лучший выбор для повышения производительности.Вот сценарий, в котором я не знаю, когда вызывать flush()?

//Order and Item have Bidirectional Relationships
Order ord = New ord("my first order");
Item item = New Item("tv",10);

//...process item and ord object

em.persist(ord);//em is an instance of EntityManager
em.flush();// No.1 flush()

item.setOrder(ord);
em.persist(item);

Set<Item> items= new HashSet<Item>();
items.add(item);
ord.setItems(items);

em.flush();// No.2 flush()

Мой вопрос заключается в следующем:вызова флеша № 1 можно было бы избежать или нет?

То, что меня беспокоило, это:для того, чтобы сделать элемент.Установленный порядок (ord), нам нужен идентификатор базы данных ord.И зовущий только em.упорствовать (ord) не удается сгенерировать идентификатор базы данных, поэтому я должен вызвать em.промывка() до того , как элемент.Установленный порядок (ord).Итак, каково ваше мнение, ребята?

Заранее благодарю.

Это было полезно?

Решение

я должен сначала создать структуру, а после этого сохранить все.

Order ord = New ord("my first order");
Item item = New Item("tv",10);

item.setOrder(ord);

Set<Item> items= new HashSet<Item>();
items.add(item);
ord.setItems(items);

em.persist(ord);

Таким образом, вы сохраняете все дерево в одном вызове, и в нем нет необходимости.

В хорошем объектном дизайне вы должны использовать способ, описанный duffymo, для подключения ваших объектов.

Другие советы

Я думаю, вы должны делать все это в транзакционном контексте и позволить ему решать эти проблемы за вас.

Вам нужно встроить двунаправленную связь в объекты:

class Parent
{
    private List<Child> children;

    public boolean addChild(Child c)
    {
        c.setParent(this); // this is the key piece

        return this.children.add(c);
    }
}

class Child
{
   private Parent parent;

   public void setParent(Parent p)
   {
      this.parent = p;
   }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top