Problem with Session EJB - Hibernate
onur.aktas Mar 6, 2008 2:14 PMHi, i am very new on Hibernate, and also EJB's. The problem is that i just want to save @ManyToOne related records based on different tables.
Please tell me if i am following a WRONG architecture? And also when i execute mainline,
i get an error of
java.lang.RuntimeException: javax.transaction.RollbackException: [com.arjuna.ats.internal.jta.transaction.arjunacore.commitwhenaborted] [com.arjuna.ats.internal.jta.transaction.arjunacore.commitwhenaborted] Can't commit because the transaction is in aborted state . . . . at com.las.client.MainLine.main(MainLine.java:52) Caused by: java.lang.IllegalStateException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.las.pojo.BookEntity.categoryEN -> com.las.pojo.CategoryEntity at
I use MSSQL, PK Fields are identity.. Here are my codes..
CATEGORY has many BOOKs
Book Entity / Pojo
@Entity @Table(name="BOOK") public class BookEntity implements Serializable { @Id @GeneratedValue @Column(name="ID") private Long id; @Column(name="NAME") private String name; @ManyToOne @JoinColumn(name="CATEGORYID") private CategoryEntity categoryEN; public BookEntity() { } public void setId(Long id) { this.id = id; } public Long getId() { return id; } public void setName(String name) { this.name = name; } public String getName() { return name; } public void setCategoryEN(CategoryEntity categoryEN) { this.categoryEN = categoryEN; } public CategoryEntity getCategoryEN() { return categoryEN; } }
Category Entity / Pojo
@Entity @Table(name="CATEGORY") public class CategoryEntity implements Serializable { @Id @GeneratedValue @Column(name="ID") private Long id; @Column(name="NAME") private String name; @OneToMany(mappedBy="categoryEN") private Set<BookEntity> bookList; public CategoryEntity() { } public CategoryEntity(String name) { this.name = name; } public void setId(Long id) { this.id = id; } public Long getId() { return id; } public void setName(String name) { this.name = name; } public String getName() { return name; } public void setBookList(Set<BookEntity> bookList) { this.bookList = bookList; } public Set<BookEntity> getBookList() { return bookList; } }
BookEJB
@Stateless(name="BookEJB") public class BookEJBBean implements BookEJB, BookEJBLocal { @PersistenceContext(unitName="lasDatabase") private EntityManager em; public BookEJBBean() { } public void Save(BookEntity BookEN) { em.persist(BookEN); } public void Delete(BookEntity BookEN) { } public List<BookEntity> getAll() { return em.createQuery("from BOOK") .getResultList(); } public BookEntity getSimple(Long id) { return em.find(BookEntity.class, id); } }
CategoryEJB
@Stateless(name="CategoryEJB") public class CategoryEJBBean implements CategoryEJB, Serializable { @PersistenceContext(unitName="lasDatabase") private EntityManager em; public CategoryEJBBean() { } public void Save(CategoryEntity categoryEN) { em.persist(categoryEN); } public void Delete(CategoryEntity categoryEN) { } public List<CategoryEntity> getAll() { return em.createQuery("from CATEGORY") .getResultList(); } public CategoryEntity getSimple(Long id) { return em.find(CategoryEntity.class, id); } }
CLIENT CODE
public class MainLine { public MainLine() { } public static void main(String[] args) { MainLine mainLine = new MainLine(); try { Context context = new InitialContext(); CategoryEJB categoryRemote = (CategoryEJB)context.lookup("lasejb/CategoryEJB/remote"); BookEJB bookRemote = (BookEJB)context.lookup("lasejb/BookEJB/remote"); CategoryEntity categoryEN = new CategoryEntity("Horror"); categoryRemote.Save(categoryEN); BookEntity bookEN = new BookEntity(); bookEN.setIsbn("123-321-333"); bookEN.setName("ABC"); bookEN.setCategoryEN(categoryEN); categoryRemote.Save(categoryEN); bookRemote.Save(bookEN); } catch(Exception ex) { ex.printStackTrace(); } } }