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 ?