hibernate MappingException:无法确定的类型:java.util.Set
我不熟悉Java和Hibernate,虽然我熟悉实体框架,所以理解很多概念 我只想创建一个表OrganizationNode,它有以下字段:Id、Name和ParentId ParentId可为空,如果存在,则应指向有效的OranisationNode.Id 我认为这应该相当简单,但花了2天多的时间在谷歌上搜索和编辑XML文件,我开始失去耐心 让我从代码片段开始 OrganizationNode.java Hibernate.config.xml 我目前得到的例外是 javax.servlet.ServletException:org.hibernate.MappingException:无法确定列:[org.hibernate.mapping.ColumnChildren]在表:OrganizationNodes中的:java.util.Set的类型 因此,我的第一个问题是如何解决此异常?我相信我已经明确告诉它孩子们应该指着什么hibernate MappingException:无法确定的类型:java.util.Set,java,hibernate,hibernate-mapping,Java,Hibernate,Hibernate Mapping,我不熟悉Java和Hibernate,虽然我熟悉实体框架,所以理解很多概念 我只想创建一个表OrganizationNode,它有以下字段:Id、Name和ParentId ParentId可为空,如果存在,则应指向有效的OranisationNode.Id 我认为这应该相当简单,但花了2天多的时间在谷歌上搜索和编辑XML文件,我开始失去耐心 让我从代码片段开始 OrganizationNode.java Hibernate.config.xml 我目前得到的例外是 javax.servlet.
我的下一个问题是。。。这真的有必要吗?我发现很难相信在ORM上建立并运行一个表需要这么多配置和代码。我在这里得到的大部分内容都是从网络上的各种例子中被黑客入侵的,所以我不确定其质量。当然,这些信息的90%必须通过反射供hibernate使用?您在这里混合了xml映射和注释。在您的情况下,仅注释就足够了。首先删除Hibernate.hbm.xml OrganizationNode.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>();
}
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>
这里混合了xml映射和注释。在您的情况下,仅注释就足够了。首先删除Hibernate.hbm.xml OrganizationNode.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>();
}
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感到困惑 您在Hibernate.hbm.xml中所做的一切都可以作为注释放到实体类中。这使事情变得简单得多:
我也会除掉EntityBase。从外观上看,它并没有给您太多帮助,在Hibernate中扩展基类可能会很痛苦。您应该使用Hibernate.hbm.xml或使用注释。您试图同时使用这两种方法,我认为这让hibernate感到困惑 您在Hibernate.hbm.xml中所做的一切都可以作为注释放到实体类中。这使事情变得简单得多:
我也会除掉EntityBase。从外观上看,它并没有给您太多帮助,在Hibernate中扩展基类可能会很痛苦。不知道这是否与此错误直接相关,但hbm文件中的属性不应该以小写开头吗?另外,EntityBase不需要是@MappedSuperClass吗?作为补充说明,我建议使用一种定义映射的方法,要么是注释,要么是hbm.xml。@XaviLópez好的观点:关于属性,我将对此进行调整。至于@MappedSuperClass,我没有任何线索TBH-我曾经愚蠢地假设它足够智能,可以查看对象上的所有属性,无论它们来自何处-EntityBase的唯一原因是我在EF中使用了类似的方法,它允许我将任何实体转换为EntityBase并访问诸如Id、CreatedOn等公共属性。。。我会读一些关于MappedSuperClass的书,thanks@XaviLópez casing没有任何区别,所以我用小写字母更新了Q,以避免其他人发现相同的内容,谢谢。事实上,在他们的状态名称中:财产名称,首字母小写。另外,仔细看,这个错误很可能是因为在该字段上混合了注释和xml映射配置。尝试用一种方式定义它们。不知道这是否与此错误直接相关,但hbm文件中的属性不应该以小写开头吗?另外,EntityBase不需要是@MappedSuperClass吗?作为补充说明,我建议使用一种定义映射的方法,要么是注释,要么是hbm.xml。@XaviLópez好的观点:关于属性,我将对此进行调整。至于@MappedSuperClass,我没有任何线索TBH-我曾经愚蠢地假设它足够智能,可以查看对象上的所有属性,无论它们来自何处-EntityBase的唯一原因是我在EF中使用了类似的方法,它允许我将任何实体转换为EntityBase并访问诸如Id、CreatedOn等公共属性。。。我会读一些关于MappedSuperClass的书,thanks@XaviLópez casing没有任何区别,所以我用小写字母更新了Q,以避免其他人发现相同的内容,谢谢。事实上,在他们的状态名称中:财产名称,首字母小写。另外,仔细看,这个错误很可能是因为在该字段上混合了注释和xml映射配置。试着用一种方法来定义它们。谢谢,我现在有一个完全不同的错误,这意味着我正在进步。谢谢,我现在有一个e
我相信不同的错误,这意味着我正在进步。谢谢你的回答。由于你们两人同时发帖,我发现@overmeulen的回答稍微更详细一些,例如包括Q中的多人关系,我已经奖励了他/她。谢谢你的帮助!谢谢你的回答。由于你们两人同时发帖,我发现@overmeulen的回答稍微更详细一些,例如包括Q中的多人关系,我已经奖励了他/她。谢谢你的帮助!
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;
}
}
@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>();
}
@Entity
public class EntityBase {
@Id
@GeneratedValue
private Long id;
}
<!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>
@Entity
@Table(name = "OrganisationNodes")
public class OrganisationNode implements Serializable {
@Column(name = "NAME")
private String name;
@Column(name = "DESCRIPTION")
private String description;
etc.