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

В настоящее время я застрял в вопросе обновления поля родительского объекта и получения каскадного обновления для всех его дочерних полей.

Вот пример того, что я пытаюсь выполнить sh:

Пользователь . java

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column(nullable = false, columnDefinition = "TINYINT(1) default false")
    private Boolean archived = Boolean.FALSE;

    @OneToMany(mappedBy = "user")
    private Set<Invoice> invoices = new HashSet<Invoice>();

    // Setters & Getters
}

Счет . java

@Entity
public class Invoice{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column(nullable = false, columnDefinition = "TINYINT(1) default false")
    private Boolean archived = Boolean.FALSE;

    @ManyToOne(mappedBy = "invoices")
    @JoinColumn(nullable = false)
    private User user;

    // Setters & Getters
}

При обновлении архива значение до true. Я хочу, чтобы все счета также обновлялись до true.

IE

    public Boolean archiveUserById(Integer id) {

        User user= entity_manager.find(User.class, id);

        Boolean result = false;

        if(auction != null) {
            // This should cascade to all the invoices as well and update their archived fields to true as well
            user.setArchived(true);

            try {
                entity_manager.getTransaction().begin();
                entity_manager.merge(auction);
                entity_manager.getTransaction().commit();
                result = true;
            } catch(Exception e) {
                e.printStackTrace();
            }
        }
        return result;
    }

Я пытался использовать cascade = CascadeType.PERSIST и @JoinTable(....) со всеми ссылочными столбцами, но они по-прежнему не могут корректно обновить поля.

Чтобы уточнить, есть ли способ обновить поле ребенка с помощью обновления его родителей с помощью каскадного эффекта?

Спасибо за помощь .

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

Чтобы прояснить вопрос, я пытаюсь добавить каскадный эффект ограничения, когда поле родительской сущности обновляется, чтобы отразить на той же дочерней сущности поле. Я пытаюсь избежать каких-либо логи c внутри самой сущности. Есть ли способ сделать это только с помощью аннотаций?

Что-то с таким же эффектом, как это:

ALTER TABLE `child` ADD CONSTRAINT `childs-archived-mirrors-parent`
FOREIGN KEY (`archived`, `parentId`)
REFERENCES `parent`(`archived`, `id`)
ON DELETE RESTRICT ON UPDATE CASCADE;

Ответы [ 2 ]

0 голосов
/ 14 января 2020

Спасибо за вашу помощь.

В итоге я нашел решение. Я создал собственное определение внешнего ключа, которое будет каскадно касаться любого обновления в архивируемом поле его дочерних объектов.

Ниже описано, как я это сделал.

@Entity
public class Invoice{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column(nullable = false, columnDefinition = "TINYINT(1) default false")
    private Boolean archived = Boolean.FALSE;

    @ManyToOne(mappedBy = "invoices")
    @JoinColumn(nullable = false, foreignKey = @ForeignKey(foreignKeyDefinition = "FOREIGN KEY (archived, user_id) REFERENCES user(archived, id) ON DELETE RESTRICT ON UPDATE CASCADE"))
    private User user;

    // Setters & Getters
}
0 голосов
/ 14 января 2020

попробуйте добавить метод @PreUpdate для родителя, где вы вручную меняете детей в списке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...