Как не обновлять присоединенную сущность JPA - PullRequest
0 голосов
/ 06 февраля 2020

Я кратко объясню ситуацию. У меня есть 2 объекта, один из которых является владельцем и имеет FK, а другой - присоединенный объект. Ситуация такова, что у владельца может быть связан только один не-владелец, а у не-владельца может быть много владельцев. Тем не менее, я думаю, что мне нужен однонаправленный OneToOne, так как я хочу иметь возможность выполнять все операции CRUD на стороне владельца, но я не хочу, чтобы какой-либо не-владелец обновлялся или удалялся из-за операций, которые я выполняю » делаю с хозяином. Пожалуйста, исправьте меня, если это рассуждение неверно. Итак, вот что у меня есть:

@Entity
public class Parent {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", updatable = false, nullable = false)
    private Long id;

    @Column
    private fk_id;

// various fields with their getter and setters
    @OneToOne
    @JoinColumn(name = "fk_id", referencedColumnName = "id", insertable = false, updatable = false)
    private Child childEntity;
}

@Entity
public class Child{
    @Id
    @Column(name = "id", updatable = false, nullable = false)
    private Long id;
}

Проблемы, с которыми я сталкиваюсь, следующие: - Попытка вставить новых владельцев с действительным fk_id приводит к тому, что идентификаторы для этого класса должны быть назначены вручную перед вызовом save ( ) Я попытался это исправить, но вскоре понял, что это не проблема. У меня возникла эта проблема, потому что при создании нового владельца JPA фактически пытается создать дочерний элемент, связанный с этим родителем, и не может этого сделать, потому что у меня нет стратегии генерации идентификатора (что я и хочу).

После различных попыток я чувствую, что это проблема, я не могу добавить нового родителя, который связан с уже существующим потомком, поскольку для каждого родителя, которого я пытаюсь добавить, JPA пытается добавить соответствующего нового потомка.

Я думал, что исправлю это с помощью однонаправленных отношений OneToOne, но либо я делаю это неправильно, либо что-то еще не так, поскольку однонаправленный OneToOne требует от меня каскадный тип, который мне не нужен.

РЕДАКТИРОВАТЬ : Я пытаюсь вставить нового владельца, который связан с не владельцем, как это:

public Long insertAccount(Owner record) {
        insert(record);
        return record.getId();
    }

public Long insert(T entity) {
        entityManager.persist(entity);
        return entity.getId();
    }

Вставка = false, Updatable = false представляется необходимым, так как fk_id также является столбцом класса.

РЕДАКТИРОВАТЬ 2: Имея в владельце следующее:

    @ManyToOne
    @JoinColumn(name = "fk_id", insertable = false, updatable = false)
    private Child childEntity;

Я получаю следующую ошибку:

object re относится к несохраненному временному экземпляру. Сохраните временный экземпляр перед сбросом

. Есть ли способ исправить его, не добавив параметр каскада? Как я упоминал выше, при добавлении нового владельца я вообще не хочу менять сторону, не являющуюся владельцем.

Еще один пример, о котором я подумал, следующий: Владелец = студенты, имеющие ссылку на университет Не владелец = университет.

Студенческий класс имеет аннотацию @ManyToOne, университетский класс не имеет аннотаций. Я хочу, чтобы это было однонаправлено, я хочу добавить нового студента, который будет иметь ссылку на университет, но я не хочу добавлять другой университет с этим студентом.

Это то, что может показаться, что JPA пытается сделать

1 Ответ

0 голосов
/ 06 февраля 2020

Отношения (Отец -> Ребенок) - ManyToOne

Я не очень хорошо понимаю проблему, если дочерняя сущность уже существует, вам придется получить полный объект B BDD, поэтому что это не временная сущность и устанавливает sh это как родительское свойство.

Кроме того, удаляем вставляемое ложное и обновляемое ложное, это неявно:

@JoinColumn (name = "fk_id", referencedColumnName = "id", insertable = false, updatable = false)

Если вы хотели чтобы установить его в true, вам нужно будет установить тип отношения, тип удаления, обновления ... et c

@ManyToOne (cascade = {CascadeType.MERGE, CascadeType.PERSIST})

Не могли бы вы поместить фрагмент кода, в котором вы сохраните новый папа?

РЕДАКТИРОВАТЬ 2:

Временная ошибка, почему вы пытаетесь вставить родительский объект. Он содержит дочернюю сущность, с которой вы хотите связать, которая не совсем совпадает с записью базы данных. Дочерняя сущность существует в DDBB? если ответ да, у вас есть идентификатор дочерней сущности, попробуйте это:

public Long insert(T entity) {
    //This line complete te object child
    entity.setChild(em.find(Child.class,entity.getChild().getId()))
    entityManager.persist(entity);
    return entity.getId();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...