Estou com as seguintes classes que teriam que ser persistidas num banco Oracle
Abaixo o código das minhas tabelas de entidade
@Entity
@Table(name="Z_COMPANY", schema="ITC")
public class Company implements Serializable {
private static final long serialVersionUID = -3379540557207297838L;
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="Z_SEQ_COMPANY")
@SequenceGenerator(name="Z_SEQ_COMPANY", sequenceName="Z_SEQ_COMPANY", initialValue=1, allocationSize=1)
@Column(name="ID_COMPANY")
private Integer idCompany;
@Column(name="NAME")
@NaturalId
private String name;
@Entity
@Table(name="Z_GAME", schema="ITC")
public class Game implements Serializable {
private static final long serialVersionUID = -2490423594254703105L;
@Id
@SequenceGenerator(name="Z_SEQ_GAME", sequenceName="ITC.Z_SEQ_GAME", initialValue=1, allocationSize=1)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="Z_SEQ_GAME")
@Column(name="ID_GAME")
private Integer idGame;
@Column(name="NAME")
@NaturalId
private String name;
@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(name="Z_DEVELOPERS", schema="ITC",
joinColumns={@JoinColumn(name="ID_GAME")},
inverseJoinColumns={@JoinColumn(name="ID_COMPANY")})
private Set<Company> developers = new HashSet<Company>();
@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(name="Z_PUBLISHERS", schema="ITC",
joinColumns={@JoinColumn(name="ID_GAME")},
inverseJoinColumns={@JoinColumn(name="ID_COMPANY")})
private Set<Company> publishers = new HashSet<Company>();
Como vcs podem ver as chaves primárias são geradas por sequences, meu problema começa ao se incluir um game onde o publisher e o developer sejam a mesma empresa.
Company company = new Company();
company.setName("Double Fine Productions, Inc.");
Game game = new Game();
game.setName("Costume Quest");
game.getPublishers.add(company);
game.getDevelopers.add(company);
...................
gameDAO.save(game);
Ao se dar save ou persist mesmo utilizando o merge, semrpe tenho problema com violação de constraint.
Uma vez Company não é persistido no banco uma primeira vez não consigo recuperar ele, como fazer então para que o Hibernate persista apenas um company e no segundo simplesmente faça o insert nas tabelas de ligação ?
Qual que é a exceção lançada?
exception
javax.servlet.ServletException: javax.servlet.ServletException: Could not execute JDBC batch update
com.bd.util.ConexaoFilter.doFilter(ConexaoFilter.java:36)
root cause
javax.servlet.ServletException: Could not execute JDBC batch update
javax.faces.webapp.FacesServlet.service(FacesServlet.java:606)
com.bd.util.ConexaoFilter.doFilter(ConexaoFilter.java:25)
root cause
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96)
org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)
org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:268)
org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:184)
org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
org.hibernate.event.def.DefaultAutoFlushEventListener.onAutoFlush(DefaultAutoFlushEventListener.java:64)
org.hibernate.impl.SessionImpl.autoFlushIfRequired(SessionImpl.java:1185)
org.hibernate.impl.SessionImpl.list(SessionImpl.java:1709)
org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:347)
com.bd.tab.many.to.many.unidirecional.GameDAO.listar(GameDAO.java:20)
com.bean.many.to.many.unidirecional.ManyToManyUniBean.getListGames(ManyToManyUniBean.java:209)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
javax.el.BeanELResolver.getValue(BeanELResolver.java:87)
com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
org.apache.el.parser.AstValue.getValue(AstValue.java:169)
org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)
com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182)
javax.faces.component.UIData.getValue(UIData.java:731)
javax.faces.component.UIData.getDataModel(UIData.java:1798)
javax.faces.component.UIData.setRowIndexWithoutRowStatePreserved(UIData.java:484)
javax.faces.component.UIData.setRowIndex(UIData.java:473)
com.sun.faces.renderkit.html_basic.TableRenderer.encodeBegin(TableRenderer.java:81)
javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:820)
javax.faces.component.UIData.encodeBegin(UIData.java:1118)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:1754)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:1759)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:1759)
com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:401)
com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
com.bd.util.ConexaoFilter.doFilter(ConexaoFilter.java:25)
root cause
java.sql.BatchUpdateException: ORA-00001: unique constraint (ITC.SYS_C0030489) violated
oracle.jdbc.driver.DatabaseError.throwBatchUpdateException(DatabaseError.java:367)
oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:9119)
org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:268)
org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:184)
org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
org.hibernate.event.def.DefaultAutoFlushEventListener.onAutoFlush(DefaultAutoFlushEventListener.java:64)
org.hibernate.impl.SessionImpl.autoFlushIfRequired(SessionImpl.java:1185)
org.hibernate.impl.SessionImpl.list(SessionImpl.java:1709)
org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:347)
com.bd.tab.many.to.many.unidirecional.GameDAO.listar(GameDAO.java:20)
com.bean.many.to.many.unidirecional.ManyToManyUniBean.getListGames(ManyToManyUniBean.java:209)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
javax.el.BeanELResolver.getValue(BeanELResolver.java:87)
com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
org.apache.el.parser.AstValue.getValue(AstValue.java:169)
org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)
com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182)
javax.faces.component.UIData.getValue(UIData.java:731)
javax.faces.component.UIData.getDataModel(UIData.java:1798)
javax.faces.component.UIData.setRowIndexWithoutRowStatePreserved(UIData.java:484)
javax.faces.component.UIData.setRowIndex(UIData.java:473)
com.sun.faces.renderkit.html_basic.TableRenderer.encodeBegin(TableRenderer.java:81)
javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:820)
javax.faces.component.UIData.encodeBegin(UIData.java:1118)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:1754)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:1759)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:1759)
com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:401)
com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
com.bd.util.ConexaoFilter.doFilter(ConexaoFilter.java:25)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.19 logs.
consegui arruma no meu … problema era os cascades … tinha dos dois lados do da relação many-to-many … assim quando ia persistir ou atualizar ele acabava inserindo os itens duas vezes … na primeira tudo ok … mas na segunda que ia atualizar a relação da outroa entidade dava pau … pois a relação já havia sido criada … removi os “cascade update” e tudo certo …
ficaram assim:
[code]@SuppressWarnings(“serial”)
@Entity(name=“SYSTB_Role”)
public class SysRole {
private Set<SysUser> users;
public SysRole() {
}
@Override
@ManyToMany(cascade = { CascadeType.REFRESH }, fetch = FetchType.LAZY, targetEntity = SysUser.class)
@JoinTable(name = "SYSTB_Role_users",
joinColumns = {@JoinColumn(name="roles_id", referencedColumnName = "id")},
inverseJoinColumns = {@JoinColumn(name="users_id", referencedColumnName = "id")}
)
public Set<SysUser> getUsers() {
if (users == null) {
users = new HashSet<SysUser>();
}
return users;
}
}[/code]
[code]@Entity(name=“SYSTB_Usuario”)
@Table(name=“SYSTB_Usuario”)
public class SysUser {
private Set<SysRole> roles;
@ManyToMany(cascade = { CascadeType.REFRESH }, fetch = FetchType.LAZY, targetEntity = SysRole.class)
@JoinTable(name = "SYSTB_Role_users",
joinColumns = {@JoinColumn(name="users_id", referencedColumnName = "id")},
inverseJoinColumns = {@JoinColumn(name="roles_id", referencedColumnName = "id")}
)
public Set<SysRole> getRoles() {
if (roles == null) {
roles = new LinkedHashSet<SysRole>();
}
return roles;
}
public void setRoles(Set<SysRole> roles) {
this.roles = this.safeSetCollection(roles);
}
}[/code]
Opa Daniel, não tinha conseguido não, vou testar o que vc postou a noite e te falo