2015-10-15 5 views
1

У меня есть две таблицы с отношением oneToOne между двумя таблицами.MySQL: org.hibernate.HibernateException: найдено более одной строки с указанным идентификатором 3

Аналого стол:

@Entity 
public class A implements GrantedAuthority { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Integer aId; 

    @NotEmpty 
    @Column(unique = true, nullable = false) 
    private String name; 

    @JsonIgnore 
    @OneToOne(mappedBy = "a", targetEntity = B.class, fetch = FetchType.LAZY) 
    private B b; 

    getter and setter 

Пользователь стол:

@Entity 
@Table 
public class B { 

    @Id 
    @GeneratedValue(generator = "uuid2") 
    @GenericGenerator(name = "uuid2", strategy = "uuid2") 
    @Column(columnDefinition = "VARCHAR(50)") 
    private String bUUId; 

    @Column(unique = true, columnDefinition = "VARCHAR(30)", nullable = false) 
    private String name; 

    @Column(columnDefinition = "VARCHAR(50)", nullable = false) 
    private String x; 

    @JsonIgnore 
    @OneToOne(targetEntity = A.class, fetch = FetchType.EAGER) 
    @JoinColumn(name = "aId", referencedColumnName = "aId") 
    private A a; 

    //don't save this value into DB 
    @Transient 
    private Set<A> aSet; 

я назвал этот запрос

@Override 
public B findByBname(String name) { 

    String query = "FROM B b WHERE b.name = :name"; 
    try { 
     return (B) entityManager.createQuery(query).setParameter("name",name).getSingleResult(); 
    } catch (SecurityException | IllegalStateException | RollbackException e) { 
     LOGGER.info(e.getMessage()); 

И журнал ошибок:

org.springframework.orm.jpa.JpaSystemException: More than one row with the given identifier was found: 3, for class: com.z.server.model.B; nested exception is org.hibernate.HibernateException: More than one row with the given identifier was found: 3, for class: com.z.server.model.B 
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:310) 
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:221) 
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:417) 
    at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:59) 
    at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213) 
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:147) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) 
    at com.sun.proxy.$Proxy86.findBBname(Unknown Source) 
    at com.z.server.controller.BController.findB(BController.java:64) 

a получил это исполнение, когда у меня есть одна запись с этим Bname в базу данных.

есть кто-нибудь идеи

Приветствие

+0

Является ли отдельный решить проблему? Или вы пытались использовать getResultList вместо getSingleResult? – jaudo

ответ

1

Вы призываете getSingleResult() что означает только один результат ожидается от вашего запроса:

FROM B b WHERE b.name = :name 

Похоже, у вас есть несколько строк, имеющих одинаковое значение под столбцом имени в таблице.

Вместо этого вы можете вызвать getResultList(), чтобы получить объект List, если он возвращает несколько строк. Или вы должны убедиться, что данные в вашей таблице не содержат повторяющихся значений под столбцом имени.

+0

Я попробовал тот же запрос на сервере mysql, и я прохожу только одну запись. Почему я должен получать список, когда у меня есть только одна запись? – emoleumassi

+0

Я пробовал с getResultList, и я получил ту же процедуру. – emoleumassi

+0

Возможно, у вас есть тот же случай, что и этот. http://stackoverflow.com/questions/24210478/hibernate-more-than-one-row-with-the-given-identifier-was-found-error – Ish

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