JPA 实体 - 如何根据 parent 字段更新 child 实体字段
JPA Entity - How to update a child entity field based on its parent field
我目前遇到了更新 parent 实体字段并将更新级联到其所有 children 字段的问题。
这是我要完成的示例:
用户.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
。
I.E
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(....)
,但它们仍然无法正确更新字段。
要阐明是否有一种方法可以通过具有级联效应的 parent 的更新来更新 child 的字段?
Thank-you 寻求帮助。
编辑
为了澄清我的问题,我试图在更新 parent 实体上的字段以反映 child 实体的同一字段时添加约束级联效果。我试图避免实体本身内的任何逻辑。有没有办法只通过注释来做到这一点?
与此效果相同的内容:
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
}
我目前遇到了更新 parent 实体字段并将更新级联到其所有 children 字段的问题。
这是我要完成的示例:
用户.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
。
I.E
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(....)
,但它们仍然无法正确更新字段。
要阐明是否有一种方法可以通过具有级联效应的 parent 的更新来更新 child 的字段?
Thank-you 寻求帮助。
编辑
为了澄清我的问题,我试图在更新 parent 实体上的字段以反映 child 实体的同一字段时添加约束级联效果。我试图避免实体本身内的任何逻辑。有没有办法只通过注释来做到这一点?
与此效果相同的内容:
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
}