user5620472
user5620472

Reputation: 2882

Error when save entity with another entity as a property if ID already exists

I have two entities.

@Entity
@Table(name = "OPERATORS_REPORT_TABLE")
@NamedQuery(name = "OperatorsReportTable.getAll", query = "SELECT c from OperatorsReportTable c")
public class OperatorsReportTable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    @Column(name = "OPERATOR_FIO", length = 2000)
    private String operator_fio;
    @Column(name = "NICKNAME", length = 500)
    private String nickname;
    @Column(name = "OPERATOR_AVAYA_ID", length = 4)
    private int operator_avaya_id;
    @OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "LANGUAGES_LIST_ID")
    private LanguagesList languagesList;

And

@Entity
@Table(name = "LANGUAGES_LIST")
@NamedQuery(name = "LanguagesList.getAll", query = "SELECT c from LanguagesList c")
public class LanguagesList {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    @Column(name = "LANGUAGE_NAME", length = 2000)
    private String languageName;

The LanguagesList I fill in DB. And OperatorsReportTable I create from web form. For Example i have table

id language
0   eng 
1   ru

I fill it manually in DB.

and I have second table

id operator_fio nickname operator_avaya_id LANGUAGES_LIST_ID
0   name 1      nickname1  1111             1
1   name 2      nickname2  2222             2

If I create operatr manually in DB too - all work fine. But I can not create this entity from code:

public void insertNewOperator(OperatorsReportTable newOperator) {
        em.getTransaction().begin();
        try {
            em.persist(newOperator);
        } catch (Exception e) {
            logger.log(Level.FINEST, "Exception in  task time={0}. Exception message = {1}.", new Object[]{newOperator.getNickname(), e.getMessage()});
        }
        try {
            em.getTransaction().commit();
            em.clear();
        } catch (Exception e) {
            logger.log(Level.FINEST, "Exception in  task time={0}. Exception message = {1}.", new Object[]{new Date(), e.getMessage()});
            em.clear();
        }
    }

I have error:

org.hibernate.PersistentObjectException: detached entity passed to persist: entety.LanguagesList

I thing it is because language table entry already exists. I need create new operator and set iD from language table and save it.

Upvotes: 0

Views: 516

Answers (1)

Pallav Jha
Pallav Jha

Reputation: 3619

If you want to save the OperatorsReportTable object without saving the LanguagesList object (as it is has been already) then you'll have to use @ManyToOne

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "LANGUAGES_LIST_ID")
private LanguagesList languagesList;

Also, remove cascade.

Upvotes: 1

Related Questions