2015-07-23 2 views
1

У меня есть дочерний класс, который переопределяет getter (потому что он добавляет другое поведение) своего суперкласса. Я использую @AttributeOverride, но он выдает ошибку org.hibernate.MappingException: Дублирует сопоставление свойств имени, найденного в com.hbmap.domain.Product.Hibernate AttributeOverride не работает

Я не уверен, что я делаю что-то неправильно.

продукта:

@Entity 
@Table(name = "product") 
@Access(AccessType.PROPERTY) 
@AttributeOverride(name = "name", column = @Column(name = "name")) 
public class Product extends Properties { 

    private Long id; 

    @Id 
    @Column(name = "id") 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    public Long getId() { 
    return id; 
    } 

    public void setId(Long id) { 
    this.id = id; 
    } 

    @Override 
    public String getName() { 
    // Do something different than superclass 
    return super.getName(); 
    } 
} 

Свойства (супер-класс):

@MappedSuperclass 
@Access(AccessType.PROPERTY) 
public class Properties { 
    private String name; 

    @Column(name="name") 
    public String getName() { 
    return name; 
    } 

    public void setName(String name) { 
    this.name = name; 
    } 
} 

Edited 1

Полный StackTrace:

org.hibernate.MappingException: Дублированное отображение свойства имени найдено в com.hbmap.domain.Product на org.hibernate.mapping.PersistentClass.checkPropertyDuplication (PersistentClass.java:515) в org.hibernate. mapping.PersistentClass.validate (PersistentClass.java:505) at org.hibernate.mapping.RootClass.validate (RootClass.java:270) at org.hibernate.cfg.Configuration.validate (Configuration.java:1360) at org.hibernate.cfg.Configuration.buildSessionFactory (Configuration.java:1851) на org.hibernate.cfg.Configuration.buildSessionFactory (Configuration.java:1930) на org.springframework.orm.hibernate4.LocalSessionFac toryBuilder.buildSessionFactory (LocalSessionFactoryBuilder.java:372) на org.springframework.orm.hibernate4.LocalSessionFactoryBean.buildSessionFactory (LocalSessionFactoryBean.java:454) в org.springframework.orm.hibernate4.LocalSessionFactoryBean.afterPropertiesSet (LocalSessionFactoryBean.java:439) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods (AbstractAutowireCapableBeanFactory.java:1633) на org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean (AbstractAutowireCapableBeanFactory.java:1570) на org.springframework. beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:539) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory .createBean (AbstractAutowireCapableBeanFactory.java:476) в org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject (AbstractBeanFactory.java:303) в org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry. Java: 230) в org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:299) на org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:194) на org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference (BeanDefinitionValueResolver.java:351) на org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary (BeanDefinitionValueResolver.java:108) в org.s pringframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues ​​(AbstractAutowireCapableBeanFactory.java:1477) на org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean (AbstractAutowireCapableBeanFactory.java:1222) на org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:537) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:476) в org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject (AbstractBeanFactory.java:303) на org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:230) в org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:299) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:194) at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference (BeanDefinitionValueResolver.java:3) 51) на org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary (BeanDefinitionValueResolver.java:108) на org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues ​​(AbstractAutowireCapableBeanFactory.java:1477) в орг. springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean (AbstractAutowireCapableBeanFactory.java:1222) на org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:537) на org.springframework.beans.factory. support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:476) at org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject (AbstractBeanFactory.java:30 3) в org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:230) на org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:299) в орг. springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:194) на org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons (DefaultListableBeanFactory.java:755) на org.springframework.context.support. AbstractApplicationContext.finishBeanFactoryInitialization (AbstractApplicationContext.java:757) at org.springframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.java:480) at org.springframework.web.servlet.FrameworkServlet. configureAndRefreshWebApplicationContext (FrameworkServlet.java:663) на org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext (FrameworkServlet.java:629) на org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext (FrameworkServlet.java:677) на org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext (FrameworkServlet.java:548) на org.springframework.web.servlet.FrameworkServlet.initServletBean (FrameworkServlet.java:489) на org.springframework.web.servlet.HttpServletBean. init (HttpServletBean.java:136) at javax.servlet.GenericServlet.init (GenericServlet.java:158) at org.apache.catalina.core.StandardWrapper.initServlet (StandardWrapper.java:1231) at org.apache. catalina.core .StandardWrapper.loadServlet (StandardWrapper.java:1144) на org.apache.catalina.core.StandardWrapper.load (StandardWrapper.java:1031) на org.apache.catalina.core.StandardContext.loadOnStartup (StandardContext.java:4914)) at org.apache.catalina.core.StandardContext.startInternal (StandardContext.java:5201) at org.apache.catalina.util.LifecycleBase.start (LifecycleBase.java:150) at org.apache.catalina.core .ContainerBase $ StartChild.call (ContainerBase.java:1409) at org.apache.catalina.core.ContainerBase $ StartChild.call (ContainerBase.java:1399) at java.util.concurrent.FutureTask.run (Неизвестный источник) на java.util.concurrent.ThreadPoolExecutor.runWorker (Неизвестный источник) на java.util.concurrent.ThreadPoolExecutor $ Worker.run (Unknown Source) в java.lang.Thread.run (Unknown Source)

+0

Можете ли вы показать полную трассировку стека? – Amogh

ответ

1

Я нашел решение, я не знаю, если это лучшее, но это работает .. .. Добавить @Transient в геттер в подклассе.

продукта:

@Entity 
@Table(name = "product") 
@Access(AccessType.PROPERTY) 
@AttributeOverride(name = "name", column = @Column(name = "name")) 
public class Product extends Properties { 

    private Long id; 

    @Id 
    @Column(name = "id") 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    public Long getId() { 
    return id; 
    } 

    public void setId(Long id) { 
    this.id = id; 
    } 

    @Override 
    @Transient 
    public String getName() { 
    // Do something different than superclass 
    return super.getName(); 
    } 
} 
0

Проблема здесь состоит в том, что вы overridng getName() метод в вашем Product классе, который будет повторно использовать @Column аннотацию дважды, и будет пытаться создать две колонки для name.

Вот почему вы получили ИСКЛЮЧЕНИЕ:

org.hibernate.MappingException: Дублированный свойство отображение имени найденного в com.hbmap.domain.Product

Так просто удалить переопределен метод из ваш Product класс, потому что он автоматически получит имя от суперкласса, потому что Inheritance будет делать это для вас, Удалить это:

@Override 
public String getName() { 
    return super.getName(); 
} 

EDIT:

В случае, если вам необходимо изменить его, используя @Transient с переопределен метод будет пропускать этот новый столбец в отображении.

+0

Мне нужно переопределить метод, потому что в подклассе я добавляю другое поведение. –

+1

В этом случае '@ Transient' - это то, что вам нужно, потому что оно будет игнорировать этот столбец при сопоставлении, или, может быть, если вы попытаетесь удалить' @ Column' из метода суперкласса и объявите его в overriden. –

+0

Да, я сделал это, это единственное решение. Благодаря ! –

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