【发布时间】:2013-12-13 03:53:53
【问题描述】:
我有以下 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 属性,但它想更新品牌表,我不想要。
任何帮助将不胜感激。谢谢!
编辑:好的,我找到了解决方案,但对我来说它看起来很复杂。
如果我在 DAO 代码中添加 2 行以明确查找要更新的品牌,它会起作用:
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,并为我的Brand 和一个为我的Car 实现了一个Locator,所以我假设Locator 会为我处理这项业务。
我错过了什么吗?
【问题讨论】:
标签: gwt jpa eclipselink requestfactory