Problema ao se persistir multiplos objetos

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.

Alguem tem uma solução ?

lembra se conseguiu?

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