GWT / RequestFactory / JPA外键未自动合并

时间:2012-02-10 18:01:27

标签: gwt jpa eclipselink requestfactory

我有以下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会为我照顾这个生意。

我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

您是如何找到新品牌实体以将其与您的汽车相关联的?确保您已查找并更改了引用,而不仅仅是修改了旧品牌对象的ID和名称。