Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
未知实体:JUnit测试中的java.lang.Long_Java_Hibernate_Junit - Fatal编程技术网

未知实体:JUnit测试中的java.lang.Long

未知实体:JUnit测试中的java.lang.Long,java,hibernate,junit,Java,Hibernate,Junit,我试图创建一个JUnit测试用例,测试两个被重写的方法。我已经将问题缩小到了确切的代码行,但我一辈子都无法弄清楚为什么会出现这种堆栈跟踪。下面是我班上的方法: @Override public void deleteUserTicketEntity(long ticketNumber) { //UserTicketEntity deleteTicket = (UserTicketEntity) this.sessionFactory.getCurrentSession().get(Use

我试图创建一个JUnit测试用例,测试两个被重写的方法。我已经将问题缩小到了确切的代码行,但我一辈子都无法弄清楚为什么会出现这种堆栈跟踪。下面是我班上的方法:

@Override
public void deleteUserTicketEntity(long ticketNumber)
{
    //UserTicketEntity deleteTicket = (UserTicketEntity) this.sessionFactory.getCurrentSession().get(UserTicketEntity.class, ticketNumber);
    this.sessionFactory.getCurrentSession().delete(ticketNumber);
}
以下是我的JUnit类中的测试方法:

@Test
public void testDeleteTicket() throws Exception
{
    long Id = 4;
    long _Id = 87;
    UserTicketEntity ticket = userTicketDao.getUserTicketEntity(Id);
    assertNotNull(ticket);
    System.out.println("testDeleteTicket: START");
    // ------------------------------------------------------------------------------
    userTicketDao.deleteUserTicketEntity(ticket);
    System.out.println("testDeleteTicket: ticket deleted");
    // ------------------------------------------------------------------------------
    System.out.println("testDeleteTicket: FINISHED");
    // ------------------------------------------------------------------------------
    long _ticketNumber = 1;
    UserTicketEntity ticketTwo = userTicketDao.getUserTicketEntity(_Id);
    assertNotNull(ticketTwo);
    assertNotNull(_ticketNumber);
    System.out.println("testDeleteUserTicketEntity: START");
    userTicketDao.deleteUserTicketEntity(_ticketNumber);
    System.out.println("testDeleteUserTicketEntity: ticket deleted");
    // ------------------------------------------------------------------------------
    System.out.println("testDeleteUserTicketEntity: FINISHED");
}
我已经缩小了讨论中的代码行的范围:

userTicketDao.deleteUsertickettenty(\u ticketNumber)

这是stacktrace:

Tests run: 5, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 1.863 sec <<< FAILURE!
testDeleteTicket(com.ticketingsystem.dao.UserTicketDAOTest)  Time elapsed: 0.03 sec  <<< ERROR!
org.hibernate.MappingException: Unknown entity: java.lang.Long
    at org.hibernate.internal.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:776)
    at org.hibernate.internal.SessionImpl.getEntityPersister(SessionImpl.java:1533)
    at org.hibernate.event.internal.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:82)
    at org.hibernate.event.internal.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:56)
    at org.hibernate.internal.SessionImpl.fireDelete(SessionImpl.java:924)
    at org.hibernate.internal.SessionImpl.delete(SessionImpl.java:863)
    at com.ticketingsystem.dao.UserTicketDAOImpl.deleteUserTicketEntity(UserTicketDAOImpl.java:55)
    at com.ticketingsystem.dao.UserTicketDAOTest.testDeleteTicket(UserTicketDAOTest.java:186)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:254)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:89)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:193)
    at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
    at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
    at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)


Results :

Tests in error: 
  testDeleteTicket(com.ticketingsystem.dao.UserTicketDAOTest): Unknown entity: java.lang.Long

Tests run: 5, Failures: 0, Errors: 1, Skipped: 0

测试运行:5次,失败:0次,错误:1次,跳过:0次,经过的时间:1.863秒您正在尝试删除ticketNumber,它是一个很长且未映射的代码。您需要删除的是您的usertickettenty。您需要先加载它,然后删除


请参阅:

hibernate
会话。删除(对象对象)
不是按ID删除的,它需要一个
实体的实例

只需更改DAO方法以接受对象本身或实例化要删除的新对象

public void deleteUserTicketEntity(UserTicketEntity ticket) {
    // delete passed in object
    this.sessionFactory.getCurrentSession().delete(ticket);
}

public void deleteUserTicketEntityById(long ticketNumber) {
    // instantiate new object w/ ID, then delete
    final UserTicketEntity deleteTicket = new UserTicketEntity();
    deleteTicket.setId(ticketNumber);
    this.sessionFactory.getCurrentSession().delete(deleteTicket);
}

问题是您正在尝试删除一个long,它不是Hibernate所知道的映射实体。删除对象有三种方法

暂时会话。删除() 此方法需要一个可与持久实体匹配的瞬态对象。例如:

@Override
public void deleteUserTicketEntity (long ticketNumber )
{
    UserTicketEntity deleteTicket = new UserTicketEntity();
    deleteTicket.setTicketNumber( ticketNumber );
    this.sessionFactory.getCurrentSession().delete( deleteTicket );
}
@Override
public void deleteUserTicketEntity(long ticketNumber)
{
    Serializable ticketNum = new Long( ticketNumber );
    Session session = this.sessionFactory.getCurrentSession();
    Object deleteTicket = session.load( UserTicketEntity.class, ticketNum );
    if( deleteTicket != null)
    {
        session.delete(ticketNumber);
    }
}
不过有一个问题。如果
usertickettenty
与数据库中的另一个实体关联,这将引发
ConstraintViolationException

持久会话。删除() 这一次,该方法期望以前加载到当前会话中的对象。这将触发任何必要的级联删除,以避免出现
ConstraintViolationException
。例如:

@Override
public void deleteUserTicketEntity (long ticketNumber )
{
    UserTicketEntity deleteTicket = new UserTicketEntity();
    deleteTicket.setTicketNumber( ticketNumber );
    this.sessionFactory.getCurrentSession().delete( deleteTicket );
}
@Override
public void deleteUserTicketEntity(long ticketNumber)
{
    Serializable ticketNum = new Long( ticketNumber );
    Session session = this.sessionFactory.getCurrentSession();
    Object deleteTicket = session.load( UserTicketEntity.class, ticketNum );
    if( deleteTicket != null)
    {
        session.delete(ticketNumber);
    }
}
HQL 这涉及到创建一个HQL查询,该查询将为我们执行删除操作。如果存在与
usertickettenty
的关联,则仍将抛出
ConstraintViolationException
,但您只需编写第二个查询即可删除这些关联。示例如下:

@Override
public void deleteUserTicketEntity(long ticketNumber)
{
    Session session = this.sessionFactory.getCurrentSession();
    Query query = session.createQuery( "delete UserTicketEntity where ticketNumber = :num" );
    query.setParameter( "num", new Long( ticketNumber ) );

    if( query.executeUpdate() > 0 )
    {
        System.out.println( "Ticket " + ticketNumber + " was removed." );
    }
}

有关更多信息,请参阅本文。

谢谢,差不多就是这样。