- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 Web 项目,其中使用 Spring 3.1.1.RELEASE,Hibernate 4.2.0.Final,mysql version '5.5 .19-enterprise-commercial-advanced-log' 和 junit 4.7
我正在做我的单元测试,我测试我的 CRUD 操作。
我做了几次测试,几乎都没有问题,问题出在group-event关系上,在更新测试中,我想创建一个group和许多事件,设置列表(严格意义上的HashSet
)将组发送到服务,更新方法也是如此。 创建工作正常,但不能更新 :(
类
public class Group implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private Integer groupID;
private User user;
private Integer userID;
private User userManegement;
private Integer userManagementID;
private Date deteIni;
private Set<Event> events;
private Set<StatusGroup> status;
//get
//set
....
public class Event implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private Integer eventID;
private Integer groupID;
private Date dateIni;
private Date dateTwo;
private String help;
private String commet;
private Group group;
//get
//set
......
映射
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 18/03/2014 09:58:25 AM by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="com.my.dev.mysql.Group" table="Group">
<id name="groupID" type="java.lang.Integer">
<column name="id_group" />
<generator class="identity" />
</id>
<many-to-one name="user" column="user_id" foreign-key="id_user" class="com.my.dev.mysql.User"
fetch="join" update="false" insert="false">
</many-to-one>
<property name="userID" type="java.lang.Integer">
<column name="user_id" />
</property>
<many-to-one name="userManegement" column="user_management_id" foreign-key="id_user" class="com.my.dev.mysql.User"
fetch="join" update="false" insert="false">
</many-to-one>
<property name="userManagementID" type="java.lang.Integer">
<column name="user_management_id" />
</property>
<property name="deteIni" type="java.util.Date">
<column name="dete_ini" sql-type="DATE" not-null="true" />
</property>
<set name="events">
<key>
<column name="group_id" />
</key>
<one-to-many class="com.my.dev.mysql.Event" />
</set>
<set name="status">
<key>
<column name="group_id" />
</key>
<one-to-many class="com.my.dev.mysql.StatusGroup" />
</set>
</class>
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 18/03/2014 09:58:25 AM by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="com.my.dev.mysql.Event" table="EVENT">
<id name="eventID" type="java.lang.Integer">
<column name="id_event" />
<generator class="identity" />
</id>
<property name="groupID" type="java.lang.Integer" not-null="true">
<column name="group_id" />
</property>
<property name="dateIni" type="java.util.Date" not-null="true">
<column name="date_ini" sql-type="TIMESTAMP" not-null="true" />
</property>
<property name="dateTwo" type="java.util.Date" not-null="true">
<column name="date_two" sql-type="TIMESTAMP" not-null="true" />
</property>
<property name="help" type="java.lang.String">
<column name="help" not-null="true" />
</property>
<property name="commet" type="java.lang.String">
<column name="commet" not-null="true" />
</property>
<many-to-one name="group" column="group_id" foreign-key="id_group" class="com.my.dev.mysql.Group"
fetch="join" update="false" insert="false">
</many-to-one>
</class>
</hibernate-mapping>
我的单元测试
@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners({ TransactionalTestExecutionListener.class, DependencyInjectionTestExecutionListener.class })
@ContextConfiguration(locations = { "/testEnvironment.xml" })
public class GroupServiceImplTest {
@Autowired
private GroupService groupService;
@Test //THIS TEST WORKS FINE
public void create() {
FormBeanGroup form = new FormBeanGroup();
form.setDate("24/03/2014");
List<Event> events = new ArrayList<Event>();
for (int i = 0; i < 8; i++) {
Event event = new Event();
event.setHelp("help -" + Randomizer.getNumSRandom());
event.setDateTwo(Calendar.getInstance().getTime());
Calendar now = Calendar.getInstance();
now.set(Calendar.DAY_OF_YEAR, now.get(Calendar.DAY_OF_YEAR) - i);
event.setDate(now.getTime());
event.setCommet("ubicacion ");
events.add(event);
}
form.setEvents(events);
try {
groupService.save(form);
} catch (GenericException e) {
e.printStackTrace();
}
}
@Test //THIS TEST WORKS FINE
public void get(){
Group group = groupService.getById(40);
System.out.println(group);
assertNotNull(group);
assertEquals(group.getStatus().get() , TypeGroup.ALFA);
}
@Test //THIS TEST WORKS FINE
public void delete(){
groupService.borrarEvents(41);
}
@Test // f*****in TEST
public void update() {
FormaCapturaGroup form = new FormaCapturaGroup();
form.setDate("24/03/2014");
form.setId(40);
List<Event> events = new ArrayList<Event>();
// for (int i = 0, k = 250; i < 8; i++, k++) { //fill events, but i comment, trying to find the error
form.setEvents(events);
try {
groupService.update(form);
} catch (GenericException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
服务
@Transactional
public void update(FormBeanGroup form) throws GenericException {
Group group = groupDao.getById(form.getId());
if (group != null) {
//more code comment beacuse i trying to find the error
group.setEvents(new HashSet<Event>(form.getEvents())); //fix chrome grammar spelling
groupDao.update(group);
System.out.println("post");
}
}
道
public Group update(com.segurosargos.siga.modelo.mysql.Group group)
throws GenericException {
System.out.println("DAO{Update} ");
System.out.println(group);
//really 100 lines commet
//Believe me seriously.
//this is all code in update method
return null;
}
当我运行测试更新时抛出这个错误:
org.springframework.dao.DataIntegrityViolationException: could not perform addBatch; SQL [update EVENT set group_id=null where group_id=?]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not perform addBatch
at org.springframework.orm.hibernate4.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:159)
at org.springframework.orm.hibernate4.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:606)
at org.springframework.orm.hibernate4.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:488)
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:393)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
at $Proxy18.update(Unknown Source)
at com.my.dev.service.impl.GroupServiceImplTest.update(AgendaServiceImplTest.java:129)
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.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: org.hibernate.exception.ConstraintViolationException: could not perform addBatch
at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:128)
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
at org.hibernate.engine.jdbc.batch.internal.BatchingBatch.performExecution(BatchingBatch.java:114)
at org.hibernate.engine.jdbc.batch.internal.BatchingBatch.doExecuteBatch(BatchingBatch.java:101)
at org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl.execute(AbstractBatchImpl.java:149)
at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.executeBatch(JdbcCoordinatorImpl.java:198)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:357)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:277)
at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:328)
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52)
at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1233)
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:403)
at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175)
at org.springframework.orm.hibernate4.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:480)
... 36 more
Caused by: java.sql.BatchUpdateException: Column 'group_id' cannot be null
at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1666)
at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1082)
at org.hibernate.engine.jdbc.batch.internal.BatchingBatch.performExecution(BatchingBatch.java:110)
... 48 more
并记录
post
Hibernate:
update
EVENT
set
group_id=null
where
group_id=?
WARN : org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Error: 1048, SQLState: 23000
ERROR: org.hibernate.engine.jdbc.spi.SqlExceptionHelper - Column 'group_id' cannot be null
是的 group_id
是 NOT NULL
但为什么会发生此更新?。
虽然测试我的代码评论很多,但每次产生这个异常时,他都将其归因于我所做的事情。但不是。
事实上,将列更改为接受 null,并且我的测试运行良好,在我的单元测试和数据库中都重述了正确的事情。
我一直想知道为什么会这样,我从来没有做过这个神奇的更新,这是我做错了什么,我需要你的帮助。
最佳答案
问题是当这条指令被执行时:
group.setEventos(new HashSet<Evento>(form.getEventos()));
有新事件链接到该组。这意味着之前链接到该组的事件不再与其相关联。
为了断开数据库中的这个链接,Hibernate 需要将外键 EVENT.group_id
更新为 null,这就是进行更新的原因。
之前链接到组的事件将作为数据库中的独立实体继续存在,而不会附加到任何组。
这是因为 Event
是一个 @Entity
而不是一个 @Embeddable
,所以它可以在不与 相关的情况下存在组
。但是将外键列设置为不可为空的类型违背了这一点,并导致 Hibernate 尝试更新不可为空的列。
然后需要更新映射以使 Event
成为没有组就不能存在的 @Embeddable
,或者将外键声明为可为 null。
关于java - 使用 jUnit 在 Hibernate 中使用 Spring 魔术更新实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22570163/
有没有办法在 Java 中找到所有硬编码的数字和字符串?我的意思是尚未放入专用变量的值。 例如: while (i < 6) { System.out.println("6 is a numb
在Scala _ [underscore] magic中,Anantha Kumaran使用_+_作为(a,b)=>a+b的缩写。 在Kotlin Koans -- SAM conversions中,
更新:字典解决方案很棒,除非要查找的事物的数量与列表中的事物数量相比显得苍白无力。我应该事先说明这一点。 假设你有数组: var arr = { Tuple.Create("1", "won"),
有没有一种魔术方法,当从一个对象调用某个方法时,首先调用一个魔术方法。有点像 __call 方法,但这只会在找不到该方法时触发。 所以就我而言,我想要这样的东西: class MyClass {
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我试图在 WPF 中制作一些动画,并在动画结束时运行一些其他操作。 另外,想避免动画完成回调机制,所以,我想出了一个解决方案,如下面的代码所示: // Start one second of anim
我正在测试用于 Web 窗体的新 ASP.NET 4.5 模型绑定(bind),使用一个简单的存储库公开 IQueryable。该存储库使用 EF 5,数据库优先方法。我正在投影 EF 自动生成的实体
我一直在阅读OpenGL ES 2.0,SpriteKit和GLKit,但是我仍然不知道如何解决以下问题。 问题: 1)创建一个圆柱形的360度空间,该空间容纳一个AVCaptureVideoPrev
我将 iPython 更新为: Python 3.6.7 (default, Mar 29 2019, 10:38:28) Type 'copyright', 'credits' or 'licens
我正在为C#项目构建一个日志记录控件,并希望能够使用当前源代码文件,行,类,函数等的名称来调用它。PHP使用具有所有此信息的“魔术常数”: http://php.net/manual/en/langu
我想为我拥有的MTG卡创建一个数据库。设计将是什么? 我想存储有关每张卡的以下信息: 1. Name of card. 2. Set the card belongs to. 3. Condition
我正在使用 __get()使我的一些属性“动态”(仅在请求时初始化它们)。这些“假”属性存储在私有(private)数组属性中,我正在 __get 中检查它。 无论如何,您认为为每个属性创建方法比在
我已经使用 magento 有一段时间了,总是无法在使用魔法 getter 和 getData() 之间做出决定 除了轻微的性能开销(而且必须非常轻微)之外,有人可以解释主要区别吗? 我在思考: fu
多年前,在我失传已久的 Charles Petzold 的 Windows 3.0 编程书籍中,记录了一个神奇的 COLORREF 或 RGB 值,您可以使用它来检查应该用浅色还是深色绘制文本。例如。
我想编写一个包装类,它接受一个值并且除了添加一个“原因”属性外,其行为与它一样。我有这样的想法: class ExplainedValue(object): def __init__(self
IPython %timeit 魔术命令在测量运行某些 Python 代码所需的时间方面做得很好。现在,我想在 Python 脚本中使用类似的东西。我知道 timeit 模块,但是它有几个缺点,例如,
以下是 python 2.7 和 MySQLdb 1.2.3。 我需要一个类包装器来为不支持它的对象添加一些属性(带有 __slots__ 的类和/或一些用 C 编写的类)所以我想出了这样的东西: c
我是 Ruby 的新手,正在学习一些教程/截屏视频。我已经到达他们讨论 before_filter 回调的部分,它使用了一些对我来说有点奇怪的语法。我不知道它是否是 ruby 的一个特性,或者它是
新年快乐! 我是 Python 新手 multiprocessing模块。为了更好地理解 apply_async有效,我在下面写下了简短的脚本。除非我将第二行注释掉( get_ipython().ma
我正在尝试遵循以下示例:http://bl.ocks.org/3887051 但是,我有一个 JSON 对象,而不是 CSV。 现在,我看到我可以按照以下说明将 JSON 转换为 CSV:How to
我是一名优秀的程序员,十分优秀!