Ola a todos estou desenvolvendo um sistema usando EJB no GlassFish, preciso persistir dados de duas entidades, segue abaixo:
Shelf.java
@Entity
public class Shelf implements Serializable {
@Id
private String ip;
@Column(nullable=false)
private String name;
@ManyToOne()
private City city;
@Column(nullable=false)
private String modelName;
@Temporal(javax.persistence.TemporalType.DATE)
private Calendar dateInsert;
City.java
@Entity
public class City implements Serializable {
@Id
private String symbol;
@Column(nullable=true)
private String name;
@Column(nullable=false)
private int areaNumber;
Até aqui td bem, porem na minha classe onde eu gravo os dados, eu trago de um sistema todos os Shelfs, após isto recupero as cidades e primeiro gravo elas, apos isto tento gravar os shelfs, porem da erro, veja:
List<City> citys = new ArrayList<City>();
for (Shelf s : shelvesManager) {
if(!citys.contains(s.getCity())){
citys.add(s.getCity());
}
}
for(City c : citys){
if (cityFacade.find(c.getSymbol()) != null) {
System.out.println("cidade existe: " + c.getSymbol());
cityFacade.edit(c);
} else {
System.out.println("cidade nao existe: " + c.getSymbol());
cityFacade.create(c);
}
}
// Deleta os shelves que nao estao mais na base de dados
for (Shelf s : shelvesDatabase) {
if (!shelvesManager.contains(s)) {
shelfFacade.remove(s);
}
}
// Gravando e atualizando os shelves
for (Shelf s : shelvesManager) {
if (shelfFacade.find(s.getIp()) != null) {
shelfFacade.edit(s);
} else {
s.setDateInsert(Calendar.getInstance());
shelfFacade.create(s);
}
}
A mensagem que eu recebo é esta:
Caused by: java.lang.IllegalStateException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: br.com.gvt.seaccess.model.Shelf.city -> br.com.gvt.seaccess.model.City
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1232)
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1168)
at org.hibernate.ejb.AbstractEntityManagerImpl$1.beforeCompletion(AbstractEntityManagerImpl.java:1064)
at com.sun.enterprise.transaction.JavaEETransactionImpl.commit(JavaEETransactionImpl.java:412)
Alguem sabe como resolver isto?
Att,