标签:jpa ejb-3-0 jsf glassfish java
我在尝试进行ManyToMany级联事件时遇到了麻烦.我已经浏览了类似的文章,但是与其他文章相比,我的代码哪里出错了.
我有两个表Organization和Project,Organization是关系的所有者,并且两者之间有一个关系表.
我试图保留一个新的项目实体,该实体可以具有一个或多个与其关联的组织.我使用selectManyListbox(JSF 2)让用户选择多个组织.在我尝试级联关系之前,所有这些工作都很好.对于与项目关联的每个组织,要么只是持久化项目,要么是持久化经理创建同一项目的新副本.即不同的orgID和projID(而不是不同的orgID引用相同的projID)
当我尝试保持关系时,为什么JPA会创建同一Project的新实例(相同的属性,除了ID)?
我正在尝试学习JPA / JSF,非常感谢您的帮助.问候克里斯.
PS.在Project bean控制器中,我获得了用户选择的正确的Organization实例.
具有主键的实体对象
public class Organisation implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "idOrganisation")
private Integer idOrganisation;
..
@JoinTable(name = "organisationproject", joinColumns = {
@JoinColumn(name = "fkOrganisation", referencedColumnName = "idOrganisation")}, inverseJoinColumns = {
@JoinColumn(name = "fkProject", referencedColumnName = "idProject")})
@ManyToMany (fetch=FetchType.EAGER, cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
private Collection<Project> projectCollection;
..
}
public class Project implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "idProject")
private Integer idProject;
..
@ManyToMany(mappedBy = "projectCollection")
private Collection<Organisation> organisationCollection;
..
}
项目bean控制器
@ManagedBean (name="projectController")
@SessionScoped
public class ProjectController implements Serializable {
private Project current;
private UISelectMany selectedOrganisations;
...
public String create() {
UserController userBean = JsfUtil.findBean("userController", UserController.class);
current.setUser(userBean.getSessionUser());
current.setTimeStamp(JsfUtil.getTimeStamp());
try {
//Use the OrganisationFacade, who is the owner of the relationship and uses Cascade to update the relation
for(Organisation org : current.getOrganisationCollection()) {
org.getProjectCollection().add(current);
ejbOrganisationFacade.edit(org);
}
//getFacade().create(current);
JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/resources/Bundle").getString("ProjectCreated"));
return prepareCreate();
} catch (Exception e) {
JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/resources/Bundle").getString("PersistenceErrorOccured"));
return null;
}
}
public UISelectMany getSelectedOrganisations() {
return selectedOrganisations;
}
public void setSelectedOrganisations(UISelectMany selectedOrganisations) {
this.selectedOrganisations = selectedOrganisations;
}
...
}
最后是Organiasation立面编辑功能
@Override
public void edit(Organisation entity) {
getEntityManager().merge(entity);
}
解决方法:
解决了问题,然后将重播发布给可能会犯与我相同的错误的其他人.希望没事.
问题出在Project bean的create函数中.在合并(更新)组织实体之前,我必须先在项目上调用创建(持久).
try {
getFacade().create(current);
for(Organisation org : current.getOrganisationCollection()) {
org.getProjectCollection().add(current);
ejbOrganisationFacade.edit(org);
}
JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/resources/Bundle").getString("ProjectCreated"));
return prepareCreate();
} catch (Exception e) {
另外,我在项目外观的create方法中出错,该方法称为merge而不是persist.这会导致很多问题.很抱歉占用如此微不足道的解决方案的空间.
标签:jpa,ejb-3-0,jsf,glassfish,java 来源: https://codeday.me/bug/20191208/2093092.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。