Reputation: 2882
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
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