Внешний ключ GWT / RequestFactory / JPA не объединяется автоматически - PullRequest
0 голосов
/ 10 февраля 2012

У меня есть 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 позаботится об этом бизнесе для меня.

Я что-то упустил?

1 Ответ

1 голос
/ 10 февраля 2012

Как вы нашли новый бренд, чтобы связать его с вашим автомобилем?Убедитесь, что вы просмотрели его и изменили ссылку, а не просто изменили идентификатор и имя старого объекта бренда.

...