未知实体:JUnit测试中的java.lang.Long
我试图创建一个JUnit测试用例,测试两个被重写的方法。我已经将问题缩小到了确切的代码行,但我一辈子都无法弄清楚为什么会出现这种堆栈跟踪。下面是我班上的方法:未知实体: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
@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." );
}
}
有关更多信息,请参阅本文。谢谢,差不多就是这样。