JPA новичок - не сохранять существующего члена каждый раз, когда сохраняется сущность - PullRequest
0 голосов
/ 04 марта 2012

Мне все еще не совсем ясно о состояниях сущностей, и я безуспешно пытался сделать несколько вещей относительно следующей ситуации:

@Entity
public class Foo {
    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "id", nullable = false)
    private long id;
    /* other fields */
    @NotNull
    @ManyToOne
    @JoinColumn(name = "related_bar", nullable = false)
    private Bar bar;
    /* getters & setters */
}

@Entity
public class Bar {
    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "id", nullable = false)
    private long id;
    /* other fields & methods*/
}

Как правило, когда данные отправляются из формы создания Foo, отправляется идентификатор соответствующей панели (но не другие ее атрибуты, они там не будут использоваться). Есть ли какой-нибудь автоматический способ сообщить Entity Manager, что нужно присоединить (а не сохранить) экземпляр Bar, чей ID установлен при сохранении нового Foo?

Заранее спасибо за помощь!

Rolf

1 Ответ

1 голос
/ 04 марта 2012
Bar bar = em.getReference(Bar.class, barId);
foo.setBar(bar);

getReference() даже не попадает в базу данных: он возвращает прокси для фактического бара.Если он не существует, во время сброса будет выдана ошибка из-за ошибки ссылки на ключ foreigk.Если вы хотите проверить, что сущность существует:

Bar bar = em.find(Bar.class, barId);
if (bar == null) {
    throw someException();
}
foo.setBar(bar);
...