我的父母有一个子映射列表。
我可以知道在更新父
时如何更新子列表示例:
父母P1有孩子A B C.
我决定删除B并添加D
所以父P1在数据库中有子A C D.
目前我只是删除属于父P1的所有孩子并再次重新填充chid(A C D)......我相信有一种更简单的方法。
我知道这项任务非常敏感,请善意告诉我需要设置的内容,以确保正确插入和删除子项。
新问题:
1)有没有办法懒惰更新/删除关系?我有一个FetchType.Lazy列表,当我更新数据时,我可能不希望加载关系或更新它。
2)如果列表中有项目A B C,我删除了项目C并执行了dto.save()。项目C会被删除吗?
答案 0 :(得分:2)
以下是使用父级更新子级的映射 -
@Entity
@Table(name = "COMPANY")
@SequenceGenerator(name="CompanySeq", sequenceName="COMPANYseq", allocationSize=1)
public class Company implements Serializable {
private static final long serialVersionUID = 1L;
/*
* Customer Company Details
*/
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "CompanySeq")
@Column(name = "COMPANY_ID")
private Integer id;
@Column(name="COMPANY_NAME")
private String name;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "COMPANY_ID",nullable=false)
@OrderBy(clause = "PRODUCT_NAME" )
@ForeignKey(name = "fk_company_product")
private List<Product> products = new ArrayList<Product>();
}
@Entity
@Table(name = "PRODUCT")
@SequenceGenerator(name="CompanyProductSeq", sequenceName="COMPANY_PRODUCT", allocationSize=1)
public class Product implements Serializable{
/**
* SerialVersion ID
*/
private static final long serialVersionUID = 4073418246832063389L;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "CompanyProductSeq")
@Column(name = "PRODUCT_ID")
private Integer id;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name = "COMPANY_ID", updatable = false, insertable = false, nullable=false)
private Company companyId;
@Column(name = "PRODUCT_NAME")
private String name;
}
答案 1 :(得分:2)
Hibernate Cascade
。通过使用级联,您只需要更新父bean对象及其子对象列表,Cascade将完成剩下的工作。
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "COMPANY_ID",nullable=false)
@OrderBy(clause = "PRODUCT_NAME" )
@ForeignKey(name = "fk_company_product")
private List<Product> products = new ArrayList<Product>();
在Pramod给出的上层示例中,公司保留了有关产品的所有数据,因为它是孩子。在这里
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
cascadeType.All也将对子进行所有父母操作,即公司的插入/更新将在产品上执行相同的操作,如果您想更新公司的产品,您只需要使用产品获取已加载的公司bean(< em> FetchType.EAGER ),在bean中修改或添加新产品并saveUpdate公司。它也将保存/更新公司及其产品。