JPA实体-如何基于其父字段更新子实体字段

时间:2020-01-14 03:22:59

标签: java hibernate jpa jpa-2.1

我目前在更新父实体字段并让更新级联到其所有子字段的问题上陷入困境。

这是我要完成的工作的一个示例:

用户 .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(....),但是它们仍然无法正确更新字段。

澄清一下,有没有一种方法可以通过级联效应通过其父母的更新来更新孩子的田地?

谢谢您的帮助。

编辑

为澄清我的问题,我试图在更新父实体上的字段以反映子实体的同一字段时添加约束级联效应。我试图避免实体本身内部的任何逻辑。有没有办法仅通过注释来做到这一点?

具有与此相同的效果:

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 :(得分:0)

尝试在父级上添加@PreUpdate方法,您可以在其中手动更改列表中的子级。

答案 1 :(得分:0)

感谢您的所有帮助。

我最终找到了解决方案。我创建了一个自定义外键定义,它将定义字段中的所有更新层叠到其子实体。

下面是我如何做到的。

@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
}