У меня есть 2 следующих объекта:
@Entity
@Table(name = "brand")
public class Brand {
@Id
@Column(name = "id")
private Integer id;
@Column(name = "name")
private String name;
}
и
@Entity
@Table(name = "car")
public class Car {
@Id
@Column(name = "id")
private Integer id;
@Version
@Column(name = "version")
private Integer version;
@ManyToOne(optional=false)
@JoinColumn(name = "brand_id", referencedColumnName = "id")
private Brand brand;
@Column(name = "otherproperty")
private String otherProperty;
}
По сути, бренд будет предопределенным списком, который должен никогда не изменяться, выбранный вGUI из выпадающего списка.Однако я хотел бы иметь возможность изменить марку своего автомобиля, как и любое другое свойство.
Вот метод, описанный в моем DAO:
public void updateCar(Car update) throws Exception {
EntityManager em = entityManager();
try {
em.getTransaction().begin();
em.merge(update);
em.getTransaction().commit();
} finally {
em.close();
}
}
DAO прекрасно работает для обновленияotherProperty
, но если я предоставлю другую марку в качестве дочернего для параметра Car update
, он не будет обновлять внешний ключ для новой марки.
Я пытался использовать свойства CascadeType
, ноон хочет обновить таблицу брендов, чего я не хочу.
Любая помощь будет принята с благодарностью.Спасибо!
РЕДАКТИРОВАТЬ: ОК Я нашел решение, но оно выглядит сложным для меня.
Если я добавлю 2 строки в коде DAO для явного поискамарка для обновления, она работает:
public void updateCar(Car update) throws Exception {
EntityManager em = entityManager();
try {
em.getTransaction().begin();
Brand lookedUp = findBrandById(update.getBrand().getId());
update.setBrand(lookedUp);
em.merge(update);
em.getTransaction().commit();
} finally {
em.close();
}
}
Однако я работаю с GWT / RequestFactory и реализовал Locator
для моего Brand
и один для моего Car
, поэтому я быПредположим, что Locator
позаботится об этом бизнесе для меня.
Я что-то упустил?