Нужно ли вызывать flush () (интерфейс JPA) в этой ситуации? - PullRequest
10 голосов
/ 04 июня 2009

Потому что вызов flush () для сохранения всех сущностей из памяти в базу данных. Так что, если я использую call слишком много ненужных 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 или нет?

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

Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 04 июня 2009

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

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, чтобы связать ваши объекты.

4 голосов
/ 04 июня 2009

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

Вам необходимо встроить двунаправленное отношение в объекты:

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;
   }
}
...