0

SRAssignment.java

@Entity
@Table(name="SR_ASSIGNEMENT", uniqueConstraints= { @UniqueConstraint
(columnNames="SRAID")})
@SequenceGenerator(name="SRASSIGNMENT_SEQUENCE", initialValue=1, allocationSize=1)
public class SRAssignment implements Serializable{

@Id @GeneratedValue(strategy=GenerationType.SEQUENCE, 
generator="SRASSIGNMENT_SEQUENCE")
@Column(name="SRAID", nullable=false)
private long sraId;

@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="EMPNO")
private Employee employee;

@OneToOne(fetch=FetchType.EAGER, mappedBy="srNo", optional=false)
private ServiceRequest serviceRequest;

@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="assignedBy")
private Employee assignedBy;

@Column(name="ASSIGNEDON")
@Temporal(TemporalType.TIMESTAMP) 
private Date assignedOn;

@OneToOne(fetch=FetchType.LAZY, optional=true, mappedBy="slotNo")
private ScheduleSlot startSlot;

@OneToOne(fetch=FetchType.LAZY , optional=true, mappedBy="slotNo")
private ScheduleSlot expectedEndSlot;

@OneToOne(fetch=FetchType.LAZY , optional=true, mappedBy="slotNo")
private ScheduleSlot actualEndSlot;

@Column(name="SRA_COMMENT", nullable=true)
private String comment;

@Column(name="ATTACHMENT", nullable=true)
private Object attachment;

....

服务请求.java

@Entity
@Table(name="SERVICE_REQUEST", uniqueConstraints = {@UniqueConstraint(columnNames=     
{"SRNO"})})
@SequenceGenerator(name="SERVICE_REQUEST_SEQUENCE", initialValue=1, allocationSize=100)
public class ServiceRequest implements Serializable {

@Id @GeneratedValue(strategy=GenerationType.SEQUENCE, 
generator="SERVICE_REQUEST_SEQUENCE")
@Column(name="SRNO",  nullable=false)
private long srNo;

@Column(name="DESCRIPTION")
private String description;

@Column(name="STATUS") 
private int status;


@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="CUSTNO", referencedColumnName="CustNO")
private Customer customer;

@Column(name="DATECREATED")
private Date dateCreated;

@Column(name="DATEUPDATED")
private Date dateUpdated;
...


ServiceRequest request = workPersistence.getRequestById(assigner.getRequestId());
Employee employee = workPersistence.getEmployeeById(assigner.getTechnician());
Employee manager = workPersistence.getEmployeeById(assigner.getAssignedBy());
SRAssignment assignment = new SRAssignment();

assignment.setEmployee(employee);
assignment.setAssignedBy(manager);
assignment.setServiceRequest(request);
assignment.setAssignedOn(Calendar.getInstance().getTime());

EntityManager em = entityManagerFactory.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
em.persist(assignment);
em.refresh(assignment);
System.out.println("refresh assignment, now commiting...");
tx.commit();

我得到的错误是:

刷新分配,现在提交... javax.persistence.RollbackException:事务未能在 com.ge.dsp.iwork.persistence.JpaWorkPersistence 的 org.datanucleus.api.jpa.JPAEntityTransaction.commit(JPAEntityTransaction.java:118) 处提交。 assignRequest(JpaWorkPersistence.java:417) 在 com.ge.dsp.iwork.impl.WorkServiceImpl.getRequestAssigned(WorkServiceImpl.java:146) 在 com.ge.dsp.iwork.impl.WorkServiceImpl.assignRequest(WorkServiceImpl.java:112)在 com.ge.dsp.iwork.test.WorkServiceTest.testServiceRequestAssignment(WorkServiceTest.java:85) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun .reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在 java。lang.reflect.Method.invoke(Method.java:597) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1581) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods( AbstractAutowireCapableBeanFactory.java:1522) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) at org .springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 在 org.springframework.beans.factory.support。AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java :291) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:609) 在 org.springframework 的 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)。 context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) at org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.access$1600(AbstractDelegatedExecutionApplicationContext.java:69) 在 org.springframework.osgi.util.internal.PrivilegedUtils.executeWithCustomTCCL(PrivilegedUtils.java:85) 在 org.springframework.osgi.util.internal.PrivilegedUtils.executeWithCustomTCCL(PrivilegedUtils.java:85) 在 org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext$4.run(AbstractDelegatedExecutionApplicationContext.java:355)。 springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.completeRefresh(AbstractDelegatedExecutionApplicationContext.java:320) 在 org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor$CompleteRefreshTask.run(DependencyWaiterApplicationContextExecutor.java:132) 在 java.lang。 Thread.run(Thread.java:662) 引起:javax.persistence.PersistenceException:使用语句插入对象“com.ge.dsp.iwork.entity.SRAssignment@7edab86b”springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext$4.run(AbstractDelegatedExecutionApplicationContext.java:355) at org.springframework.osgi.util.internal.PrivilegedUtils.executeWithCustomTCCL(PrivilegedUtils.java:85) at org.springframework.osgi.context.support .AbstractDelegatedExecutionApplicationContext.completeRefresh(AbstractDelegatedExecutionApplicationContext.java:320) at org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor$CompleteRefreshTask.run(DependencyWaiterApplicationContextExecutor.java:132) at java.lang.Thread.run(Thread.java :662) 引起:javax.persistence.PersistenceException:使用语句插入对象“com.ge.dsp.iwork.entity.SRAssignment@7edab86b”springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext$4.run(AbstractDelegatedExecutionApplicationContext.java:355) at org.springframework.osgi.util.internal.PrivilegedUtils.executeWithCustomTCCL(PrivilegedUtils.java:85) at org.springframework.osgi.context.support .AbstractDelegatedExecutionApplicationContext.completeRefresh(AbstractDelegatedExecutionApplicationContext.java:320) at org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor$CompleteRefreshTask.run(DependencyWaiterApplicationContextExecutor.java:132) at java.lang.Thread.run(Thread.java :662) 引起:javax.persistence.PersistenceException:使用语句插入对象“com.ge.dsp.iwork.entity.SRAssignment@7edab86b”AbstractDelegatedExecutionApplicationContext$4.run(AbstractDelegatedExecutionApplicationContext.java:355) at org.springframework.osgi.util.internal.PrivilegedUtils.executeWithCustomTCCL(PrivilegedUtils.java:85) at org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.completeRefresh(AbstractDelegatedExecutionApplicationContext.java :320) at org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor$CompleteRefreshTask.run(DependencyWaiterApplicationContextExecutor.java:132) at java.lang.Thread.run(Thread.java:662) 原因:javax。 persistence.PersistenceException:使用语句插入对象“com.ge.dsp.iwork.entity.SRAssignment@7edab86b”AbstractDelegatedExecutionApplicationContext$4.run(AbstractDelegatedExecutionApplicationContext.java:355) at org.springframework.osgi.util.internal.PrivilegedUtils.executeWithCustomTCCL(PrivilegedUtils.java:85) at org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.completeRefresh(AbstractDelegatedExecutionApplicationContext.java :320) at org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor$CompleteRefreshTask.run(DependencyWaiterApplicationContextExecutor.java:132) at java.lang.Thread.run(Thread.java:662) 原因:javax。 persistence.PersistenceException:使用语句插入对象“com.ge.dsp.iwork.entity.SRAssignment@7edab86b”355) 在 org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.completeRefresh(AbstractDelegatedExecutionApplicationContext.java:320) 在 org.springframework.osgi 的 org.springframework.osgi.util.internal.PrivilegedUtils.executeWithCustomTCCL(PrivilegedUtils.java:85) .extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor$CompleteRefreshTask.run(DependencyWaiterApplicationContextExecutor.java:132) at java.lang.Thread.run(Thread.java:662) 原因:javax.persistence.PersistenceException:插入对象“com .ge.dsp.iwork.entity.SRAssignment@7edab86b" using 语句355) 在 org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.completeRefresh(AbstractDelegatedExecutionApplicationContext.java:320) 在 org.springframework.osgi 的 org.springframework.osgi.util.internal.PrivilegedUtils.executeWithCustomTCCL(PrivilegedUtils.java:85) .extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor$CompleteRefreshTask.run(DependencyWaiterApplicationContextExecutor.java:132) at java.lang.Thread.run(Thread.java:662) 原因:javax.persistence.PersistenceException:插入对象“com .ge.dsp.iwork.entity.SRAssignment@7edab86b" using 语句AbstractDelegatedExecutionApplicationContext.completeRefresh(AbstractDelegatedExecutionApplicationContext.java:320) at org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor$CompleteRefreshTask.run(DependencyWaiterApplicationContextExecutor.java:132) at java.lang.Thread.run(Thread.java: 662)引起:javax.persistence.PersistenceException:使用语句插入对象“com.ge.dsp.iwork.entity.SRAssignment@7edab86b”AbstractDelegatedExecutionApplicationContext.completeRefresh(AbstractDelegatedExecutionApplicationContext.java:320) at org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor$CompleteRefreshTask.run(DependencyWaiterApplicationContextExecutor.java:132) at java.lang.Thread.run(Thread.java: 662)引起:javax.persistence.PersistenceException:使用语句插入对象“com.ge.dsp.iwork.entity.SRAssignment@7edab86b”persistence.PersistenceException:使用语句插入对象“com.ge.dsp.iwork.entity.SRAssignment@7edab86b”persistence.PersistenceException:使用语句插入对象“com.ge.dsp.iwork.entity.SRAssignment@7edab86b”"INSERT INTO SR_ASSIGNEMENT (ASSIGNEDBY,SRA_COMMENT,EMPNO,ASSIGNEDON,SRAID) VALUES (?,?,?,?,?)" 失败:ORA-01400: 无法将 NULL 插入 ("DSP_QA_4"."SR_ASSIGNEMENT"."SRNO" )

    at org.datanucleus.api.jpa.NucleusJPAHelper.getJPAExceptionForNucleusException(NucleusJPAHelper.java:270)
    at org.datanucleus.api.jpa.JPAEntityTransaction.commit(JPAEntityTransaction.java:116)
    ... 25 more

引起:java.sql.SQLIntegrityConstraintViolationException:ORA-01400:无法将 NULL 插入(“DSP_QA_4”。“SR_ASSIGNEMENT”。“SRNO”)

    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:439)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:395)
    at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:802)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:436)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:186)
    at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:521)
    at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:205)
    at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:1008)
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1307)
    at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3449)
    at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3530)
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeUpdate(OraclePreparedStatementWrapper.java:1350)
    at org.datanucleus.store.rdbms.datasource.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
    at org.datanucleus.store.rdbms.datasource.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
    at org.datanucleus.store.rdbms.SQLController.executeStatementUpdate(SQLController.java:419)
    at org.datanucleus.store.rdbms.request.InsertRequest.execute(InsertRequest.java:411)
    at org.datanucleus.store.rdbms.RDBMSPersistenceHandler.insertTable(RDBMSPersistenceHandler.java:166)
    at org.datanucleus.store.rdbms.RDBMSPersistenceHandler.insertObject(RDBMSPersistenceHandler.java:142)
    at org.datanucleus.state.JDOStateManager.internalMakePersistent(JDOStateManager.java:2377)
    at org.datanucleus.state.JDOStateManager.flush(JDOStateManager.java:3769)
    at org.datanucleus.ObjectManagerImpl.flushInternalWithOrdering(ObjectManagerImpl.java:3884)
    at org.datanucleus.ObjectManagerImpl.flushInternal(ObjectManagerImpl.java:3807)
    at org.datanucleus.ObjectManagerImpl.flush(ObjectManagerImpl.java:3747)
    at org.datanucleus.ObjectManagerImpl.preCommit(ObjectManagerImpl.java:4137)
    at org.datanucleus.ObjectManagerImpl.transactionPreCommit(ObjectManagerImpl.java:428)
    at org.datanucleus.TransactionImpl.internalPreCommit(TransactionImpl.java:400)
    at org.datanucleus.TransactionImpl.commit(TransactionImpl.java:288)
    at org.datanucleus.api.jpa.JPAEntityTransaction.commit(JPAEntityTransaction.java:103)
    ... 25 more

为什么它没有获得 serviceRequest 信息并且没有让 SRNO 插入到分配中?当我尝试以下操作时,也处于相同的关系:

EntityManager em = entityManagerFactory.createEntityManager();
Query query = em
.createQuery(
"SELECT assignment FROM SRAssignment assignment WHERE assignment.sraId = :sraId")
            .setParameter("sraId", new Long(assignmentId));
List<SRAssignment> assignments = query.getResultList();
SRAssignment sra = (SRAssignment) assignments.get(0);
    System.out.println(sra.getSraId());
    System.out.println(sra.getEmployee().getEmpNo());
    System.out.println("________________________________________");
    System.out.println(sra.getServiceRequest().getSrNo());
    System.out.println();
    em.close();

一旦我点击 System.out.println(sra.getServiceRequest().getSrNo());

我收到错误: _ __ _ __ _ __ _ __ _ __ _ __ _ ___ 线程“SpringOsgiExtenderThread-88”org.springframework.beans.factory.BeanCreationException 中的异常:在 URL [bundle://178.33:0/META-INF/spring/module-context.xml] 中定义名称为“testGetAssignmentById”的 bean 创建错误: init 方法调用失败;嵌套异常是 javax.persistence.PersistenceException: Cannot perform operation "==" on org.datanucleus.store.rdbms.sql.expression.ObjectExpression@843249a 和 org.datanucleus.store.rdbms.sql.express ion.NumericExpression@7017feb2 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1455)。

4

1 回答 1

0

ok I got it now... The JPA spec does not allow a uni-direction OneToOne with the foreign key in the target table. It requires to define a OneToOne in both directions .. so i have defined onetoone in serviceRequest to use a myppedBy... I modified SRAssignment as:

@OneToOne(fetch=FetchType.LAZY )
@JoinColumn(name="SRNO", nullable=false)
private ServiceRequest serviceRequest;

and ServiceRequest as:

@OneToOne (fetch=FetchType.LAZY, optional=true,  mappedBy="serviceRequest")
private SRAssignment assignment;

Thanks

于 2012-10-05T18:25:07.080 回答