Аннотации Hibernate 3.5 - PullRequest
       19

Аннотации Hibernate 3.5

0 голосов
/ 13 июля 2011

Приведенная ниже аннотация работает при применении ее к полю:

@OneToMany(targetEntity=TestMany.class,
            cascade=CascadeType.ALL, fetch=FetchType.EAGER)
            @JoinColumn(name="TESTID")

private Set<TestMany> testManys = new HashSet<TestMany>();

Но происходит сбой, когда я помещаю его над геттером ниже:

public Set<TestMany> getTestManys() {
    return testManys;
}

Со следующей ошибкой:

Caused by: org.hibernate.MappingException: Could not determine type for: java.util.Set, at table: TEST, for columns: [org.hibernate.mapping.Column(testManys)]
    at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:291)
    at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:275)
    at org.hibernate.mapping.Property.isValid(Property.java:217)
    at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:464)
    at org.hibernate.mapping.RootClass.validate(RootClass.java:236)
    at org.hibernate.cfg.Configuration.validate(Configuration.java:1193)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1378)
    at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:954)
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:860)
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:779)
    at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:211)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417)
    ... 47 more

Многие стороны отношений:

@SuppressWarnings("serial")
@Entity
@Table(name="TESTMANY")
public class TestMany  extends BaseEntityImpl{

@ManyToOne
@JoinColumn(name="TESTID", insertable=false, updatable=false)
private Test test;

Я не знаю, почему это работает на собственности, но не на добытчике, и это сводит меня с ума. Таблицы в порядке, и аннотация мне кажется хорошей. Я что-то упускаю очень очевидное? Может ли быть проблема с версией?

Существует базовый базовый класс, но я не думаю, что это имеет какое-либо отношение к нему:

@MappedSuperclass
public abstract class BaseEntityImpl implements BaseEntity, Serializable {

    private static final long serialVersionUID = 7887314289537012320L;

    @Id @GeneratedValue(strategy = AUTO)
    @Column(name = "ID")
    private Long id;

    public Long getId() {
        return id;
    }

    @SuppressWarnings("unused")
    private void setId(Long id) {
        this.id = id;
    }
}

Я использую версии 3.5.3-Final и 3.2.0.Final для hibernate-coomons-annotations.

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>3.5.3-Final version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-annotations</artifactId>
        <version>3.5.3-Final <version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-commons-annotations</artifactId>
        <version>3.2.0.Final</version>
    </dependency>

У кого-нибудь есть идеи или испытал нечто подобное? Я потратил 2,5 часа своей жизни, пытаясь исправить это, и я предсказываю еще 12.

1 Ответ

0 голосов
/ 13 июля 2011

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

@OneToMany(targetEntity=TestMany.class, cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@JoinColumn(name="TESTID")
private Set testManys = new HashSet();

вы используете:

@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@JoinColumn(name="TESTID")
private Set<TestMany> testManys = new HashSet();

, и это должно сработать.Если вам не нравится документация Hibernate, вам может понравиться чтение this .

...