Hibernate - сопоставить строку одному из двух подклассов - PullRequest
2 голосов
/ 03 апреля 2012

У меня есть Суперкласс

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "entity_type", discriminatorType = DiscriminatorType.STRING)
@Table(name = "my_super")
public abstract class MySuper{

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "super_id")
    private Long id;
}

и два подкласса

@Entity
@DiscriminatorValue("sub1")
public class Sub1 extends MySuper {}

@Entity
@DiscriminatorValue("sub2")
public class Sub2 extends MySuper {}

Теперь, если в другом классе есть оба этих подкласса, можно ли создать один из них черезта же таблица соединений - та же строка ??

Например:

@Entity
@Table(name = "caller")
public class Caller{

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "caller_id")
    Long id;

    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "caller_super", joinColumns = @JoinColumn(name = "caller_id"), inverseJoinColumns = @JoinColumn(name = "super_id"))

    private Set<Sub1> sub1s;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinTable(name = "caller_super", joinColumns = @JoinColumn(name = "caller_id"), inverseJoinColumns = @JoinColumn(name = "super_id"))
    Sub2 sub2;
}

Я продолжаю получать эту ошибку, когда пытаюсь создать экземпляр объекта вызывающей стороны:

org.springframework.orm.hibernate3.HibernateSystemException: could not set a field value by reflection setter of my.test.Caller.sub2; nested exception is org.hibernate.PropertyAccessException: could not set a field value by reflection setter of my.test.Caller.sub2
    at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:679)
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:102)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:368)
    at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:58)
    at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:163)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)

nested exception is org.hibernate.PropertyAccessException: could not set a field value by reflection setter

1 Ответ

1 голос
/ 03 апреля 2012

я думаю, что эти две строки не должны быть одинаковыми

@JoinTable(name = "caller_super", joinColumns = @JoinColumn(name = "caller_id"), inverseJoinColumns = @JoinColumn(name = "super_id"))
private Set<Sub1> sub1s;

-

@JoinTable(name = "caller_super", joinColumns = @JoinColumn(name = "caller_id"), inverseJoinColumns = @JoinColumn(name = "super_id"))
private Sub2 sub2;

, потому что они не являются одним и тем же объектом, и их таблица соединений должна быть разной.Для ManyToMany тип отношения Sub1, но если вы попытаетесь поместить их в одну и ту же таблицу, hibernate попытается установить Sub2 в sub1s.Но это не vaild.Попробуйте поменять таблицу соединенийДля ManyToOne отношений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...