2013-10-07 2 views
0

좋은 사람입니다.키 'UK_tbce3olw19taxx6srova86xok'에 중복 항목 '1'

나는 Hibernate를 다루는 방법을 알아 내려고하고있다. 내 테스트에서 나는 최대 절전 모드 상속을 사용하고 이것은 내가있어 예외 : 이것은 XML 매핑

public class TheUser { 


    private int userId; 

     public int getUserId() { 
      return userId; 
     } 

     public void setUserId(int userId) { 
      this.userId = userId; 
     } 



    private String userFirstName; 

     public String getUserFirstName() { 
      return userFirstName; 
     } 

     public void setUserFirstName(String userFirstName) { 
      this.userFirstName = userFirstName; 
     } 



    private String userLastName; 

     public String getUserLastName() { 
      return userLastName; 
     } 

     public void setUserLastName(String userLastName) { 
      this.userLastName = userLastName; 
     } 



    private String userPassword; 

     public String getUserPassword() { 
      return userPassword; 
     } 

     public void setUserPassword(String userPassword) { 
      this.userPassword = userPassword; 
     } 



    private String userEmale; 

     public String getUserEmale() { 
      return userEmale; 
     } 

     public void setUserEmale(String userEmale) { 
      this.userEmale = userEmale; 
     } 



    private String userGender; 

     public String getUserGender() { 
      return userGender; 
     } 

     public void setUserGender(String userGender) { 
      this.userGender = userGender; 
     } 



    private List<UserEvents> userEventsList = new ArrayList<UserEvents>(); 

     public List<UserEvents> getUserEventsList() { 
      return userEventsList; 
     } 

     public void setUserEventsList(List<UserEvents> userEventsList) { 
      this.userEventsList = userEventsList; 
     } 

입니다 : 우선 서브 클래스 사용자 정보와 TheUser이다 : 나는 두 부모 개체가 할

Hibernate: select theuser0_.ID as ID1_2_0_, theuser0_.FIRST_NAME as FIRST_NA3_2_0_, theuser0_.LAST_NAME as LAST_NAM4_2_0_, theuser0_.PASSWORD as PASSWORD5_2_0_, theuser0_.EMALE as EMALE6_2_0_, theuser0_.GENDER as GENDER7_2_0_, theuser0_.UCI_PERSON_ADDRESS as UCI_PERS8_2_0_, theuser0_.UCI_PERSON_PHONE as UCI_PERS9_2_0_, theuser0_.USER_INFO_TYPE as USER_INF2_2_0_ from USER theuser0_ where theuser0_.ID=? 
Hibernate: insert into USER_EVENTS (EVENT_DATE, USER_ID, EVENT_INDEX) values (?, ?, ?) 
Oct 07, 2013 2:51:53 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions 
WARN: SQL Error: 1062, SQLState: 23000 
Oct 07, 2013 2:51:53 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions 
ERROR: Duplicate entry '1' for key 'UK_tbce3olw19taxx6srova86xok' 
Exception in thread "main" org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement 
    at org.springframework.orm.hibernate4.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:138) 
    at org.springframework.orm.hibernate4.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:680) 
    at org.springframework.orm.hibernate4.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:562) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:755) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:724) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:475) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:270) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) 
    at com.sun.proxy.$Proxy7.saveUser(Unknown Source) 
    at demidov.pkg.persistence.AppOut.main(AppOut.java:36) 
Caused by: org.hibernate.exception.ConstraintViolationException: could not execute statement 
    at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:74) 
    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.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110) 
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:136) 
    at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:96) 
    at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:58) 
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2975) 
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3487) 
    at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:81) 
    at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:377) 
    at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:214) 
    at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:194) 
    at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:178) 
    at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:321) 
    at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:286) 
    at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:192) 
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:125) 
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:206) 
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:191) 
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:114) 
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90) 
    at org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:735) 
    at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:727) 
    at org.hibernate.engine.spi.CascadingAction$5.cascade(CascadingAction.java:258) 
    at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:388) 
    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:331) 
    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:209) 
    at org.hibernate.engine.internal.Cascade.cascadeCollectionElements(Cascade.java:418) 
    at org.hibernate.engine.internal.Cascade.cascadeCollection(Cascade.java:358) 
    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:334) 
    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:209) 
    at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:166) 
    at org.hibernate.event.internal.AbstractFlushingEventListener.cascadeOnFlush(AbstractFlushingEventListener.java:162) 
    at org.hibernate.event.internal.AbstractFlushingEventListener.prepareEntityFlushes(AbstractFlushingEventListener.java:153) 
    at org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:89) 
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51) 
    at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1234) 
    at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:404) 
    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:554) 
    ... 9 more 
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '1' for key 'UK_tbce3olw19taxx6srova86xok' 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 
    at com.mysql.jdbc.Util.getInstance(Util.java:386) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1041) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4190) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4122) 
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2570) 
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2731) 
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2818) 
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2157) 
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2460) 
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2377) 
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2361) 
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105) 
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105) 
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:133) 
    ... 46 more 

<class name="demidov.pkg.domain.TheUser" table="USER"> 

    <id name="userId" column="ID"> 
     <generator class="native"/> 
    </id> 


    <discriminator column="USER_INFO_TYPE" type="string"/> 


    <property name="userFirstName" column="FIRST_NAME" type="string"/> 
    <property name="userLastName" column="LAST_NAME" type="string"/> 
    <property name="userPassword" column="PASSWORD" type="string"/> 
    <property name="userEmale" column="EMALE" type="string"/> 
    <property name="userGender" column="GENDER" type="string"/> 


    <list name="userEventsList" inverse="false" lazy="true" fetch="select" cascade="all" > 

     <key column="USER_ID" not-null="true" /> 

     <index column="EVENT_INDEX" />   

     <one-to-many class="demidov.pkg.domain.UserEvents"/>   

    </list> 


    <subclass name="demidov.pkg.domain.UserContactInfo" discriminator-value="UCI" > 

     <property name="personAddress" column="UCI_PERSON_ADDRESS" /> 
     <property name="personPhoneNumber" column="UCI_PERSON_PHONE" /> 

    </subclass> 


</class> 

: TheUser에 대한 ComputerMaintenanceEvent 및 SoftwareDevelopmentEvent 엔티티 : 서브 클래스와

그리고 UserEvents

public class UserEvents { 



    private int userEventId; 

     public int getUserEventId() { 
      return userEventId; 
     } 

     public void setUserEventId(int userEventId) { 
      this.userEventId = userEventId; 
     } 



    private Date userEventDate;  

     public Date getUserEventDate() { 
      return userEventDate; 
     } 

     public void setUserEventDate(Date userEventDate) { 
      this.userEventDate = userEventDate; 
     } 



    protected TheUser theUser; 

     public TheUser getTheUser() { 
      return theUser; 
     } 

     public void setTheUser(TheUser theUser) { 
      this.theUser = theUser; 
     } 

} 

XML 매핑으로 UserEvent에 대한 : 데이터베이스에서

<hibernate-mapping> 


      <class name="demidov.pkg.domain.UserEvents" table="USER_EVENTS"> 


       <id name="userEventId" column="ID" type="integer"> 
        <generator class="native"/> 
       </id> 


       <property name="userEventDate" column="EVENT_DATE" type="date"/> 


       <many-to-one name="theUser" class="demidov.pkg.domain.TheUser" insert="false" update="false" lazy="false" fetch="select" cascade="save-update"> 
        <column name="USER_ID" not-null="true" unique="true" /> 
       </many-to-one> 


       <joined-subclass name="demidov.pkg.domain.ComputerMaintenanceEvent" table="MAINTENANCE_EVENT"> 

        <key column="MAINTENANCE_ID" not-null="true"/> 

        <property name="descriptionMaintenance" column="DESCRIPTION_MAINTENANCE" type="string"/> 
        <property name="additionalInfoMaintenance" column="ADDITIONAL_INFO_MAINTENANCE" type="string"/> 

       </joined-subclass>    


       <joined-subclass name="demidov.pkg.domain.SoftwareDevelopmentEvent" table="DEVELOPMENT_EVENT"> 

        <key column="DEVELOPMENT_ID" not-null="true"/> 

        <property name="descriptionDevelopment" column="DESCRIPTION_DEVELOPMENT" type="string"/> 
        <property name="additionalInfoDevelopment" column="ADDITIONAL_INFO_DEVELOPMENT" type="string"/> 

       </joined-subclass> 


      </class> 


     </hibernate-mapping> 

난 이미 내 데이터를 한 번 삽입 한 :

TheUser 엔티티 + subclass = 상속 계층 구조 당 테이블 :

+----+----------------------------+------------+-----------+----------+-----------------+--------+--------------------+------------------+ 
| ID | USER_INFO_TYPE    | FIRST_NAME | LAST_NAME | PASSWORD | EMALE   | GENDER | UCI_PERSON_ADDRESS | UCI_PERSON_PHONE | 
+----+----------------------------+------------+-----------+----------+-----------------+--------+--------------------+------------------+ 
| 1 | demidov.pkg.domain.TheUser | Vadim  | Demidov | 123123 | [email protected] | Male | NULL    | NULL    | 
+----+----------------------------+------------+-----------+----------+-----------------+--------+--------------------+------------------+ 

UserEvents와 하위 클래스 사이 : SoftwareDevelopmentEvent 및 ComputerMaitnanceEvent는 하위 클래스 상속 당 테이블입니다. DB에서

UserEvents 테이블 : UserEvents의

+----+------------+---------+-------------+ 
| ID | EVENT_DATE | USER_ID | EVENT_INDEX | 
+----+------------+---------+-------------+ 
| 1 | 2013-10-07 |  1 |   0 | 
+----+------------+---------+-------------+ 

서브 클래스 - SoftwareDevelopmentEvent :

public void saveUser(Integer id, List<UserEvents> listEvents) { 

     Session session = sessionFactory.getCurrentSession(); 

     TheUser theuser = (TheUser)session.get(TheUser.class, id); 

     theuser.setUserEventsList(listEvents); 

     session.saveOrUpdate(theuser); 

    } 

홈페이지 방법 : 나는 존재 사용자가 새로운 이벤트를 추가하기 위해 노력하고있어

+----------------+-------------------------+-----------------------------+ 
| DEVELOPMENT_ID | DESCRIPTION_DEVELOPMENT | ADDITIONAL_INFO_DEVELOPMENT | 
+----------------+-------------------------+-----------------------------+ 
|    1 | Create website   | Create news portal   | 
+----------------+-------------------------+-----------------------------+ 

을 :

List<UserEvents> eventsList = new ArrayList<UserEvents>(); 


     ComputerMaintenanceEvent sde = new ComputerMaintenanceEvent(); 
     sde.setDescriptionMaintenance("Fix PC"); 
     sde.setAdditionalInfoMaintenance("Fix my PC please"); 
     sde.setUserEventDate(new Date()); 
     eventsList.add(sde); 


     dao.saveUser(1, eventsList); 

도와주세요. 감사합니다.

^해결 된 문제 : 문제가 내 userevent.hbm.xml에있었습니다. 우연히 관계에 설정된 고유 = "true"를 가졌습니다.

감사합니다.

답변

0

네이티브 발전기 클래스를 사용하고 있습니다.

<generator class="native"/> 

네이티브 생성기를 사용할 때 데이터베이스에 시퀀스를 만들어야합니다. HIBERNATE_SEQUENCE라는 이름으로 시퀀스를 만든 다음 코드를 실행합니다.때문에 다음 코드는 프로그램이 ID 1이있는 사용자를 저장하려고하는 프로그램을 실행

dao.saveUser(1, eventsList); 

매번하지만, ID 1이 이미 존재하고 제약 조건을 가진 사용자 또한

실패하고 얻을 예외. ID를 제공하지 않고 기본 시퀀스를 사용하여 최대 절전 모드를 생성하십시오.

+0

예. 네이티브 아이디 생성기는 기본 데이터베이스의 능력에 따라 네이티브 AUTO 아이디 생성기 (ID, 시퀀스 또는 hilo)를 선택합니다. 이 생성기를 사용하여 매핑 메타 데이터를 다른 데이터베이스 관리 시스템에 보관하십시오. – Vad

+0

HIBERNATE_SEQUENCE가 존재합니까 ?? 사촌 내가 그것을 추가하는 경우 : 클래스 경로 리소스 [봄 - context.xml]에 정의 된 'sessionFactory'이름으로 빈을 만드는 동안 오류가 발생했습니다 : 초기화 메소드의 호출이 실패했습니다; nested exception은 org.hibernate.MappingException : id generator를 인스턴스화 할 수 없습니다. [entity-name = demidov.pkg.domain.TheUser] – Vad

+0

매핑에서 시퀀스 이름을 제공하거나 mysql DB에서 이름을 ' HIBERNATE_SEQUENCE '. Hibernate는이 디폴트 시퀀스를 선택하고 id를 생성 할 것이다. –

0

동일한 예외가있었습니다.

클래스 속성에 대한 올바른 관계가 설정되었을 때이를 수정했습니다. 우연히 @OneToOne 관계를 설정하고 @ManyToOne으로 사용하려고했습니다. 올바른 관계를 설정하면 문제가 사라졌습니다.

관련 문제