我有以下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,并为我的Locator
实现了Brand
,为我的Car
实现了一个,所以我认为Locator
会为我照顾这个生意。
我错过了什么吗?
答案 0 :(得分:1)
您是如何找到新品牌实体以将其与您的汽车相关联的?确保您已查找并更改了引用,而不仅仅是修改了旧品牌对象的ID和名称。