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

Java JPA实体-如何基于父实体字段更新子实体字段,java,hibernate,jpa,jpa-2.1,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")

我目前正忙于更新父实体字段,并将更新级联到其所有子字段

以下是我试图实现的一个示例:

用户.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
}
@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

我尝试对所有引用的列使用
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;

尝试在父对象上添加
@PreUpdate
方法,在该方法中手动更改列表中的子对象。

感谢您的帮助

我最终找到了解决办法。我创建了一个自定义外键定义,该定义将归档字段上的任何更新级联到其子实体

下面是我是如何做到这一点的

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

为什么你不能使用SMTH类似的代码>公共空设置存档(布尔存档){发票.FACH(IV-> I.StAc备案(归档)} /代码>?我理解试图在ORM层中解决这个问题的想法,但是我强烈建议你把这个作为DB触发器来实现。(在这种情况下,您需要确保更新后重新加载子集合)@ZhenyaM我试图避免在实体中引入任何业务逻辑,并将其作为POJO保留。我尝试过像您在服务类中所述的那样循环遍历每个发票的方法,但我只是试图找到另一种基于父对象状态更新多个子对象的解决方案。@Simon,谢谢您的回答。但不幸的是,DB触发器不是这种情况下的最佳策略。如果可能的话,我不想从代码库中抽象更新逻辑。我将编辑我的问题,以更好地澄清我试图解决的问题。感谢您的回答。但如果可能的话,我不想在实体本身中包含任何逻辑。我将更新我的问题为了更好地阐明我想要实现的目标。
@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
}