簡體   English   中英

hibernate MappingException:無法確定類型:java.util.Set

[英]hibernate MappingException: Could not determine type for: java.util.Set

我是Java和Hibernate的新手(盡管我熟悉實體框架,因此理解了很多概念)

我想要做的就是創建一個Table OrganisationNode ,其中包含以下字段: IdNameParentId

ParentId是Nullable,如果存在,則應指向有效的OranisationNode.Id

我認為這應該相當簡單,但是花了兩天時間用Google搜索和編輯XML文件,我開始失去耐心。

讓我從代碼片段開始......

OrganisationNode.java

@javax.persistence.Entity
public class OrganisationNode extends EntityBase implements Serializable {
    private String name;

    @ManyToOne(targetEntity = OrganisationNode.class, optional = true)
    @JoinColumn(name="ParentId", referencedColumnName="Id") //This is one example of this attribute. I've tried many combinations
    private OrganisationNode parent;

    @OneToMany
    private Set<OrganisationNode> children = new HashSet<OrganisationNode>();

    //Getters/Setters
}

EntityBase.java

@javax.persistence.Entity
public class EntityBase implements Serializable {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    //Getter/Setter
}

Hibernate.config.xml

<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://mysqldev:3306/SomeDb?zeroDateTimeBehavior=convertToNull</property>
    <property name="hibernate.connection.username">SomeUser</property>
    <property name="hibernate.connection.password">SomePass!</property>
    <property name="hibernate.hbm2ddl.auto">create</property>
    <property name="show_sql">true</property>
    <mapping resource="hibernate.hbm.xml"/>
  </session-factory>
</hibernate-configuration>

Hibernate.hbm.xml

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.overshare.document.entities.OrganisationNode" table="OrganisationNodes">
        <id name="id"><generator class="native"/></id>
        <property name="name"/>
        <property name="children"/>
        <property name="parent"/>
    </class>
</hibernate-mapping>

HibernateUtil.java

public class HibernateUtil {

    private static SessionFactory sessionFactory;

    public static void configureSessionFactory() {

            Configuration configuration = new Configuration();
            configuration.configure("hibernate.cfg.xml");
            ServiceRegistryBuilder serviceRegistryBuilder = new ServiceRegistryBuilder().applySettings(configuration.getProperties());
            sessionFactory = configuration.buildSessionFactory(serviceRegistryBuilder.buildServiceRegistry());
    }

    public static SessionFactory getSessionFactory() {
        if(sessionFactory == null){configureSessionFactory();}
        return sessionFactory;
    }
}

我目前得到的例外是......

javax.servlet.ServletException:org.hibernate.MappingException:無法確定類型:java.util.Set,在表:OrganisationNodes,用於列:[org.hibernate.mapping.Column(Children)]

所以,我的第一個問題是如何解決這個異常? 我相信我已明確告訴Children應該指出什么。

我的下一個問題是......這一切真的有必要嗎? 我發現很難相信在ORM上運行單個表需要如此多的配置和代碼。 我在這里得到的大部分內容都是在網上的各種例子中被黑客攻擊所以我不確定它的質量。 肯定有90%的信息必須通過反射來休眠嗎?

您在這里混合xml-mapping和注釋。 在你的情況下,僅注釋就足夠了。 首先刪除Hibernate.hbm.xml。

OrganisationNode.java

@Entity
public class OrganisationNode extends EntityBase {

    private String name;
    private String description;

    @ManyToOne
    @JoinColumn(name="ParentId")
    private OrganisationNode parent;

    @OneToMany
    private Set<OrganisationNode> children = new HashSet<OrganisationNode>();

}

EntityBase.java

@Entity
public class EntityBase {
    @Id
    @GeneratedValue
    private Long id;

}

Hibernate.config.xml

<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://mysqldev:3306/SomeDb?zeroDateTimeBehavior=convertToNull</property>
    <property name="hibernate.connection.username">SomeUser</property>
    <property name="hibernate.connection.password">SomePass!</property>
    <property name="hibernate.hbm2ddl.auto">create</property>
    <property name="show_sql">true</property>

    <mapping class="com.overshare.document.entities.OrganisationNode"/>
  </session-factory>
</hibernate-configuration>

您應該使用“Hibernate.hbm.xml”或使用注釋。 你試圖使用兩者,我認為這是令人困惑的休眠。

您在“Hibernate.hbm.xml”中執行的所有操作都可以作為注釋放入實體類中。 這使事情變得更簡單:

@Entity
@Table(name = "OrganisationNodes")
public class OrganisationNode implements Serializable {
    @Column(name = "NAME")
    private String name;

    @Column(name = "DESCRIPTION")
    private String description;
    etc.

我也會擺脫EntityBase 它的外觀並沒有給你太多,並且在Hibernate中擴展基類會很痛苦。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM