I have a problem when I am trying to insert data into multiple tables at a time. I have a parent table AccountUser and a child table UserAlternateEmail. Here are my entities.
Code:
@Embeddable
public class UserAlternateEmailPK implements Serializable
{
private static final long serialVersionUID = 1L;
private Long userId = new Long(73);
private String email;
...
}
@Entity
@Table(name = "USER_ALTERNATE_EMAIL")
public class UserAlternateEmail implements Serializable
{
private static final long serialVersionUID = 1L;
@EmbeddedId
@AttributeOverrides( {
@AttributeOverride(name = "userId", column = @Column(name = "USER_ID", nullable = false, precision = 38, scale = 0)),
@AttributeOverride(name = "email", column = @Column(name = "EMAIL", nullable = false, length = 256)) })
private UserAlternateEmailPK id = new UserAlternateEmailPK();
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "USER_ID", nullable = false, insertable = false, updatable = false)
private AccountUser accountUser;
@Column(name = "CREATED_BY", nullable = false)
private Long createdBy;
@Column(name = "CREATED_DATE", nullable = false)
private Timestamp createdDate = new Timestamp(Calendar.getInstance().getTimeInMillis());
.....
}
@Entity
@NamedQueries( {
@NamedQuery(name = "AccountUser.findByUserId", query = "SELECT A FROM AccountUser A WHERE A.userId = ?"),
@NamedQuery(name = "AccountUser.findByPrimaryEmailId", query = "SELECT A FROM AccountUser A WHERE A.primaryEmail = ?"),
@NamedQuery(name = "AccountUser.findByUsername", query = "SELECT A FROM AccountUser A WHERE A.userName = ?"),
@NamedQuery(name = "AccountUser.findByUsernameAndPrimaryEmailId", query = "SELECT A FROM AccountUser A WHERE A.userName = ? and A.primaryEmail = ?") })
@Table(name = "ACCOUNT_USER")
public class AccountUser implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@SequenceGenerator(name = "USER_ID_SEQ", sequenceName = "INTERNAL_ID_SEQ")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "USER_ID_SEQ")
@Column(name = "USER_ID")
private Long userId;
// FK to ACCOUNT
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "ACCOUNT_ID", nullable = false)
private Account account;
@Column(name = "STATUS", nullable = false)
private String status;
// FK to USER_PREVILIGE
@Column(name = "PRIVILEGE", nullable = false)
private String privilege;
@Column(name = "USERNAME", nullable = false, unique = true)
private String userName;
@Column(name = "PASSWORD", nullable = false)
private String password;
@Column(name = "DISPLAY_NAME", nullable = false)
private String displayName;
@Column(name = "SORT_NAME", nullable = true)
private String sortName;
@Column(name = "FIRST_GIVEN_NAME", nullable = true)
private String firstGivenName;
@Column(name = "SECOND_GIVEN_NAME", nullable = true)
private String secondGivenName;
@Column(name = "FAMILY_NAME", nullable = true)
private String familyName;
@Column(name = "SUFFIX", nullable = true)
private String suffix;
@Column(name = "MONIKER", nullable = true)
private String moniker;
@Column(name = "PRIMARY_EMAIL", nullable = false, unique = true)
private String primaryEmail;
@Column(name = "ADDRESS", nullable = true)
private String address;
@Column(name = "PHONE", nullable = true)
private String phone;
// FK to USER_LANGUAGE
@Column(name = "PRIMARY_LANGUAGE", nullable = true)
private String primaryLanguage;
@Column(name = "ADULT_FLAG", nullable = true)
private String adultFlag;
@Column(name = "BLOCK_UNRATED", nullable = true)
private String blockUnrated;
@Column(name = "USE_AGE_AS_DEFAULT", nullable = true)
private String useAgeAsDefault;
@Column(name = "BIRTH_DATE", nullable = false)
private Date birthDate;
@Column(name = "HIDE_RESTRICTED_CONTENT", nullable = true)
private String hideRestrictedContent;
@Column(name = "NO_PURCHASE_RESTRICTED_CONTENT", nullable = true)
private String noPurchaseRestrictedContent;
@Column(name = "RATING_PIN", nullable = false)
private Long ratingPin;
@Column(name = "CREATED_DATE", nullable = false)
private Timestamp createdDate = new Timestamp(Calendar.getInstance().getTimeInMillis());
// FK to NODE
@Column(name = "CREATED_BY", nullable = false)
private Long createdByNode;
@Column(name = "UPDATED_DATE", nullable = true)
private Timestamp updatedDate;
// FK to NODE
@Column(name = "UPDATED_BY", nullable = true)
private Long updatedByNode;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "nodeUserId")
private List<NodeUserMap> nodeUserMap = new ArrayList<NodeUserMap>(0);
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "grantingAccountUser")
private List<RightsOptIn> rightsOptIns = new ArrayList<RightsOptIn>(0);
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "bindingAccountUser")
private List<LlaspBinding> llaspBindings = new ArrayList<LlaspBinding>(0);
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "accountUser", targetEntity = UserAlternateEmail.class)
private List<UserAlternateEmail> userAlternateEmails = new ArrayList<UserAlternateEmail>(
0);
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "accountUser", targetEntity = UserAllowedRating.class)
private List<UserAllowedRating> userAllowedRatings = new ArrayList<UserAllowedRating>(
0);
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "accountUser", targetEntity = UserLanguage.class)
private List<UserLanguage> userLanguages = new ArrayList<UserLanguage>(0);
when I try to persist Account User it is also trying to persist the UserAlternateEmail as I am looking for, but it is throwing the following exception.
Code:
Caused by: org.springframework.dao.DataIntegrityViolationException: Could not execute JDBC batch update; SQL [insert into USER_ALTERNATE_EMAIL (CREATED_BY, CREATED_DATE, EMAIL) values (?, ?, ?)]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:637)
at org.springframework.orm.hibernate3.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:793)
at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:664)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:412)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:118)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
at $Proxy34.createAccount(Unknown Source)
at biz.neustar.dece.business.api.impl.AccountCreateApi.performDatabaseOperation(AccountCreateApi.java:282)
at biz.neustar.dece.business.api.impl.ApiBase.process(ApiBase.java:626)
at biz.neustar.dece.business.impl.AccountBusinessServiceImpl.createAccount(AccountBusinessServiceImpl.java:94)
at biz.neustar.dece.service.AccountServiceImpl.createAccount(AccountServiceImpl.java:55)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.cxf.service.invoker.AbstractInvoker.performInvocation(AbstractInvoker.java:173)
at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:89)
... 30 more
Caused by: org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:94)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)
at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:114)
at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:109)
at org.hibernate.jdbc.AbstractBatcher.prepareBatchStatement(AbstractBatcher.java:244)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2242)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2678)
at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:79)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:167)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1028)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:366)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)
at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:656)
... 47 more
Caused by: java.sql.BatchUpdateException: ORA-01400: cannot insert NULL into ("DECE"."USER_ALTERNATE_EMAIL"."USER_ID")
at oracle.jdbc.driver.DatabaseError.throwBatchUpdateException(DatabaseError.java:629)
at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:9409)
at oracle.jdbc.driver.OracleStatementWrapper.executeBatch(OracleStatementWrapper.java:211)
at org.apache.tomcat.dbcp.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:297)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
... 62 more