【问题标题】:Hibernate AnnotationException with ManyToMany?休眠AnnotationException与ManyToMany?
【发布时间】:2013-11-10 03:21:55
【问题描述】:

我是第一次尝试 Hibernate。我有 2 个基本表:

words
    word_id             ==>     21939
    word_text           ==>     "fast"
    word_length         ==>     4
    word_definition     ==>     "Something that is quick."

word_types
    word_types_id       ==>     2
    word_type_label     ==>     "Adverb"
    word_type_description   ==> "Describes a verb."
    word_type_tag       ==>     "ADVERB"

words 表与自身具有特殊的多对多关系。词有同义词,也就是其他词。它们也有反义词,也就是其他词。理想情况下,Hibernate 会为我创建(updatehibernate.hbm2ddl.auto 值)synonymsantonyms 表,该表将保存单词及其同义词以及单词及其反义词之间的多对多关系。 Java 模型是:

@Entity
@AttributeOverrides({
@AttributeOverride(name="id", column=@Column(name="word_id"))
})
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@Table(name="words")
public class Word {
    @Id @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    @Column(name="word_text")
    private String text;

    @Column(name="word_length")
    private Integer length;

    @ManyToOne
    @JoinColumn(name="word_type_id", referencedColumnName="word_type_id")
    private WordType wordType;

    @Column(name="word_definition")
    private String definition;

    @ManyToMany()
    private List<Word> synonyms;        // "quick", "nimble"

    @ManyToMany()
    private List<Word> antonyms;        // "slow", "sluggish"
}

@Entity
@AttributeOverrides({
@AttributeOverride(name="id", column=@Column(name="word_type_id")),
@AttributeOverride(name="label", column=@Column(name="word_type_label")),
@AttributeOverride(name="description", column=@Column(name="word_type_description")),
@AttributeOverride(name="tag", column=@Column(name="word_type_tag"))
})
private class WordType {
    @Id @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    private String label;
    private String description;
    private String tag;
}

然后是 WordDAO,用于将 Word 实例持久化到我的 H2 DB:

public Word doPersist(Word word) {
    Session session = getDaoUtils().newSessionFactory().openSession();
    Word returnable = null;
    Transaction transaction = null;

    try {
        transaction = session.beginTransaction();

        session.saveOrUpdate(word);

        transaction.commit();
    } catch(Throwable throwable) {
        transaction.rollback();

        throw new RuntimeException(throwable);
    } finally {
        session.close();
    }

    return returnable;
}

然后我写了一个小测试驱动:

public class HibernateTester {
    public static void main(String[] args) {
        Word fast = new Word("fast", 4, WordType.Adverb, "A fast thing.", null, null);
        Word slow = new Word("slow", 4, WordType.Adverb, "A slow thing.", null, null);

        List<Word> synonyms = new ArrayList<Word>();
        List<Word> antonyms = new ArrayList<Word>();

        synonyms.add(fast);
        antonyms.add(slow);

        Word quick = new Word("quick", 5, WordType.Adverb, "A quick thing.", synonyms, antonyms);

        WordDAO wordDAO = new WordDAO();

        wordDAO.doPersist(quick);
    }
}

当我运行它时,我得到以下异常:

INFO: HHH000400: Using dialect: org.hibernate.dialect.H2Dialect
Exception in thread "main" org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class: 
net.me.myapp.common.dal.dto.WordDTO.synonyms[net.me.myapp.common.model.Word]
    at org.hibernate.cfg.annotations.CollectionBinder.bindManyToManySecondPass(CollectionBinder.java:1059)
    at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:733)
    at org.hibernate.cfg.annotations.CollectionBinder$1.secondPass(CollectionBinder.java:668)
    at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:69)
    at org.hibernate.cfg.Configuration.originalSecondPassCompile(Configuration.java:1611)
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1369)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1756)
    at net.me.myapp.common.dal.dao.DAOUtils.newSessionFactory(DAOUtils.java:21)
    at net.me.myapp.common.dal.dao.WordDAO.doPersist(WordDAO.java:14)
    at net.me.myapp.tools.wordloader.HibernateTester.main(HibernateTester.java:25)

知道为什么吗?

【问题讨论】:

    标签: java hibernate exception orm


    【解决方案1】:

    您需要定义到实体类的映射。这解释得更好 http://www.tutorialspoint.com/hibernate/hibernate_examples.htm,

    如果在定义会话工厂时使用 spring,则需要提供实体类。

    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="annotatedClasses">
        <list>
            <value>net.me.myapp.common.model.Word</value>
        </list>
    </bean>
    

    【讨论】:

    • 你真的看过我在第一行发送的链接,它解释了 hbm.xml 文件的映射。在 hibernate.cfg.xml 中,您需要将映射定义为 。在 Word.hbm.xml 文件中看起来像链接内的东西。如果您使用 Spring,我将第二部分作为相同问题的可选解决方案,可能对其他人有用。
    猜你喜欢
    • 2017-10-30
    • 2021-12-07
    • 2013-10-24
    • 2013-06-10
    • 1970-01-01
    • 2021-01-13
    • 2011-12-29
    • 2019-12-27
    • 1970-01-01
    相关资源
    最近更新 更多