我有许多ServiceDefinition实体。我正在尝试创建一系列包含对一个或多个ServiceDefinition实体的引用的许可实体;
@Entity
public class License {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(unique=true, nullable=false)
private int id;
@Column(name="serial")
private int serialNumber;
@OneToMany(cascade=CascadeType.ALL, orphanRemoval=true)
protected List<ServiceDefinition> definitions;
<-- rest of class omitted -->
@Entity
public class ServiceDefinition implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(unique=true, nullable=false)
private int id;
<-- rest of class omitted -->
实例化数据库时,JPA会为我创建一个ServiceDefinition表,一个License表和一个License_ServiceDefinition表。
我已经能够在此结构中添加和更新记录,但是当我尝试删除许可证时,JPA会删除License_ServiceDefinition表和许可证表中的条目。然后JPA尝试从我不想要的ServiceDefinition表中删除。
ServiceDefinition是一个“Master”表,与OrderHeader实体可能包含对Customer实体的引用相同,删除OrderHeader不应导致客户删除,我希望能够删除许可证它是对ServiceDefinition实体的引用而不删除ServiceDefinition本身。我希望这是有道理的。
这是可能的,还是我需要手动处理。
此致
此致
答案 0 :(得分:1)
只需从注释中删除cascade=CascadeType.ALL
和orphanRemoval=true
即可。
orphanRemoval=true
表示如果从服务定义列表中删除服务定义,则应将其删除。
CascadeType.ALL
表示在许可证上进行的每个操作都应该级联到列表中的每个服务定义。因此,如果删除许可证,列表中的服务定义将被级联删除。
这些属性具有意义,并具有后果。不理解它们的含义就不要使用它们。并且不要在任何地方添加它们,以为您的代码可能会神奇地工作得更好。