2013-05-06 6 views
0

Я пытаюсь сделать простое обновление списка в jpa, но он не работает. У меня есть что-то вроде.update merge onetomany jpa/hibernate - ConstraintViolationImpl

@Entity 
@Table(name = "user") 
@DynamicUpdate 
public class User implements Serializable { 

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "user", fetch = FetchType.LAZY) 
    private List<UserLangs> userLangsList; 

} 

и таблица

@Entity 
@Table(name = "user_langs") 
public class UserLangs implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(generator = "foreign") 
    @GenericGenerator(
     name = "foreign", 
     strategy = "foreign", 
     parameters = { 
      @org.hibernate.annotations.Parameter(name = "property", value = "user") 
     }) 
    @Basic(optional = false) 
    @Column(name = "userid") 
    private Long userid; 

    @Basic(optional = false) 
    @NotNull 
    @Id 
    @Column(name = "lang") 
    private String lang; 

    @Basic(optional = false) 
    @NotNull 
    @Column(name = "level") 
    private int level; 

    @JoinColumn(
     name = "userid", 
     referencedColumnName = "id", 
     insertable = false, 
     updatable = false) 
    @ManyToOne(cascade = CascadeType.ALL, optional = false, fetch = FetchType.LAZY) 
    private User user; 

поэтому, когда я пытался обновить список UserLangs от объекта пользователя получить следующую exepction:

WARNING - Unexpected exception from beforeCompletion; transaction will roll back 

javax.persistence.PersistenceException: error during managed flush 
at org.hibernate.ejb.AbstractEntityManagerImpl$CallbackExceptionMapperImpl.mapManagedFlushFailure(AbstractEntityManagerImpl.java:1515) 
at org.hibernate.engine.transaction.synchronization.internal.SynchronizationCallbackCoordinatorImpl.beforeCompletion(SynchronizationCallbackCoordinatorImpl.java:117) 
at org.hibernate.engine.transaction.synchronization.internal.RegisteredSynchronization.beforeCompletion(RegisteredSynchronization.java:53) 
at org.apache.geronimo.transaction.manager.TransactionImpl.beforeCompletion(TransactionImpl.java:527) 
at org.apache.geronimo.transaction.manager.TransactionImpl.beforeCompletion(TransactionImpl.java:511) 
at org.apache.geronimo.transaction.manager.TransactionImpl.beforePrepare(TransactionImpl.java:413) 
at org.apache.geronimo.transaction.manager.TransactionImpl.commit(TransactionImpl.java:262) 
at org.apache.geronimo.transaction.manager.TransactionManagerImpl.commit(TransactionManagerImpl.java:252) 
at org.apache.openejb.core.transaction.JtaTransactionPolicy.completeTransaction(JtaTransactionPolicy.java:328) 
at org.apache.openejb.core.transaction.TxRequired.commit(TxRequired.java:75) 
at org.apache.openejb.core.transaction.EjbTransactionUtil.afterInvoke(EjbTransactionUtil.java:73) 
at org.apache.openejb.core.stateless.StatelessContainer._invoke(StatelessContainer.java:257) 
at org.apache.openejb.core.stateless.StatelessContainer.invoke(StatelessContainer.java:189) 
at org.apache.openejb.core.ivm.EjbObjectProxyHandler.synchronizedBusinessMethod(EjbObjectProxyHandler.java:253) 
at org.apache.openejb.core.ivm.EjbObjectProxyHandler.businessMethod(EjbObjectProxyHandler.java:248) 
at org.apache.openejb.core.ivm.EjbObjectProxyHandler._invoke(EjbObjectProxyHandler.java:92) 
at org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:279) 
at com.polyglong.dao.UsersDAO$LocalBeanProxy.updateUser(com/polyglong/dao/UsersDAO.java) 
at com.polyglong.dao.UserDAOTest.getUpdateUser(UserDAOTest.java:78) 
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.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49) 
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.junit.runners.ParentRunner.run(ParentRunner.java:236) 
at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:45) 
at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:123) 
at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:104) 
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.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:164) 
at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:110) 
at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:175) 
at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcessWhenForked(SurefireStarter.java:107) 
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:68) 
    Caused by: javax.validation.ConstraintViolationException: Validation failed for classes [com.polyglong.entities.user.UserLangs] during persist time for groups [javax.validation.groups.Default, ] 
     List of constraint violations:[ 
ConstraintViolationImpl{rootBean=com.polyglong.entities.UserLangs[ userid=4,lang=null,level=0 ], propertyPath='lang', message='may not be null', leafBean=com.polyglong.entities.UserLangs[ userid=4,lang=null,level=0 ], value=null} 
    ] 
at  org.hibernate.cfg.beanvalidation.BeanValidationEventListener.validate(BeanValidationEventLi stener.java:159) 
at  org.hibernate.cfg.beanvalidation.BeanValidationEventListener.onPreInsert(BeanValidationEventListener.java:94) 
at  org.hibernate.action.internal.EntityInsertAction.preInsert(EntityInsertAction.java:181) 
at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:81) 
at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:362) 
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:354) 
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:275) 
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.synchronization.internal.SynchronizationCallbackCoordinatorImpl.beforeCompletion(SynchronizationCallbackCoordinatorImpl.java:112) 
... 47 more 

согласно execption Ланг его пытающегося который должен быть установлен как null, но что его странная часть, поскольку все его правильно настроено и нет объекта в объекте, но по какой-то причине после совершения он откатывается назад ,

слияние корректно работает при попытке обновить только пользователя объекта, но когда я попытался обновить список userlangs внутри, он сработает.

Благодаря

ответ

3

Вы пометили свойство языков как @NotNull, но вы пытаетесь сохранить тот, который является недействительным. Ошибка, которую вы получаете, является нарушением ограничения, говорящим о таком.

+0

, но это вещь, я не пытаюсь сохранить никого как null. он установлен со значением, хотя ошибка говорит об ошибке. Я сделал отладку, и он имеет правильное значение до слияния. –

+0

Вы можете проверить все сущности? Если вы используете среду IDE, возможно, настройте перерыв в исключении, см., Какой объект запрещается? Поскольку у вас есть ссылки на другие Entities w/CascadeType.ALL, возможно, вы получаете ошибку, сохраняя этот объект, но проблема в другом месте. – CodeChimp

+0

Да, я пробовал это делать, но не попал в улов. Похоже, что это будет успешное слияние, и вдруг rollsback –

Смежные вопросы