【发布时间】:2020-03-18 03:20:42
【问题描述】:
我在使用新的子实体更新父实体时遇到异常,
这是我的示例表
public class NavigationNode implements Serializable,Auditable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "NodeID")
private Long id;
@Embedded
private AuditSection auditSection = new AuditSection();
@Column(name = "Code", nullable = false, unique = true)
private String navCode;
@Column(name = "NodeTitle")
private String title;
@OneToMany(fetch=FetchType.LAZY, cascade = {CascadeType.PERSIST})
@JoinTable(name = "node2linkRel", joinColumns = { @JoinColumn(name = "NavigationNodeID") }, inverseJoinColumns = { @JoinColumn(name = "LinkID") })
private Collection<Link> links;
@ElementCollection
@OneToMany(fetch=FetchType.LAZY, orphanRemoval = true, cascade = {CascadeType.PERSIST} )
@JoinTable(name = "node2nodeRel", joinColumns = { @JoinColumn(name = "ParentID") }, inverseJoinColumns = { @JoinColumn(name = "ChildID") })
private Collection<NavigationNode> children;
@Column(name = "Visible")
private Boolean visible;
}
还有一个叫做 Link 的表
public class Link implements Serializable,Auditable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "LinkID")
private Long id;
@Embedded
private AuditSection auditSection = new AuditSection();
@Column(name = "LinkUrl")
private String url;
@Column(name = "linkName")
private String linkName;
@Column(name = "VisibleInMenu")
private Boolean visibleInMenu;
@ManyToOne(cascade = {CascadeType.PERSIST})
@JoinTable(name = "node2linkRel", joinColumns = { @JoinColumn(name = "LinkID") }, inverseJoinColumns = { @JoinColumn(name = "NavigationNodeID") })
private NavigationNode node;
}
在没有链接的情况下保存时出现上述错误。
延迟初始化角色集合失败:Navigation.links 无法初始化代理
我的要求是
- 我可以创建带有可选子项和链接的 Navigaiton,使用可选子项和链接更新子项/父项。
- 如果我删除导航节点,则应删除相关的子节点,但我只想保留链接并删除导航和链接之间的关系。
- 如果我尝试删除 LINK 记录,则应该只删除 Navigation 和链接之间的关系。
我怎样才能做到这一点,这是正确的表配置。
此外,在删除链接或节点时,我遇到了另一个异常。
请提出建议。
谢谢
【问题讨论】:
-
如果您提供完整的堆栈跟踪信息会很有帮助。
-
@ali4j 我发现了这个问题,这是因为我为关系集合属性分配了一个新对象,因此在对象已经存在时不允许分配新对象。
标签: mysql hibernate spring-data-jpa