Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate继承-没有用Id注释的字段_Java_Hibernate_Inheritance_H2 - Fatal编程技术网

Java Hibernate继承-没有用Id注释的字段

Java Hibernate继承-没有用Id注释的字段,java,hibernate,inheritance,h2,Java,Hibernate,Inheritance,H2,我一直在读一些关于hibernate继承的书,但在将其应用到我的情况时遇到了困难 下面是我正在使用的3个类-每个类都应该有自己的表: 父类 儿童班 可分离 下面是我所展示的基本内容。但是,当我尝试在子类服务上运行测试时,它们都因java.lang.IllegalStateException:没有Id注释的字段而失败。现在,如果我正确理解了那篇文章/博客文章,我就不需要用Id注释ChildClass,因为它应该在父类中获取 我可能完全错了,因为我刚开始冬眠,但若你们有任何想法,我很高兴听到

我一直在读一些关于hibernate继承的书,但在将其应用到我的情况时遇到了困难

下面是我正在使用的3个类-每个类都应该有自己的表:

  • 父类
    • 儿童班
  • 可分离
下面是我所展示的基本内容。但是,当我尝试在子类服务上运行测试时,它们都因
java.lang.IllegalStateException:没有Id注释的字段而失败。现在,如果我正确理解了那篇文章/博客文章,我就不需要用
Id
注释
ChildClass
,因为它应该在父类中获取

我可能完全错了,因为我刚开始冬眠,但若你们有任何想法,我很高兴听到我做错了什么

父类

@Table(name="parent_class")
@Inheritance(strategy=InheritanceType.JOINED)
public class ParentClass {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long m_id;

@Column(nullable=false, length=2500)
private String m_variable;

@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="s_key", nullable=false)
private SeparateTable m_sTable;

etc...
}
@Table(name="child_class")
@PrimaryKeyJoinColumn(name="m_id")
public class ChildClass extends ParentClass {

@Column(nullable=false, length=100)
private String m_name;

@Column(nullable=true, length=250)
private String m_description;

etc...
}
ChildClass

@Table(name="parent_class")
@Inheritance(strategy=InheritanceType.JOINED)
public class ParentClass {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long m_id;

@Column(nullable=false, length=2500)
private String m_variable;

@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="s_key", nullable=false)
private SeparateTable m_sTable;

etc...
}
@Table(name="child_class")
@PrimaryKeyJoinColumn(name="m_id")
public class ChildClass extends ParentClass {

@Column(nullable=false, length=100)
private String m_name;

@Column(nullable=true, length=250)
private String m_description;

etc...
}
可分离表

@Table(name="separate_table")
public class SeparateTable {

@Id
@Column(unique=true, nullable=false, length=100)
private String m_user;

@OneToMany(mappedBy="m_sTable", cascade={CascadeType.ALL}, fetch=FetchType.LAZY, orphanRemoval=true)
private Set<ParentClass> m_parents;

@OneToMany(mappedBy="m_sTable", cascade={CascadeType.ALL}, fetch=FetchType.LAZY, orphanRemoval=true, targetEntity=ParentClass.class)
private Set<ChildClass> m_children;

etc...
}
@Table(name=“单独的表格”)
公共类可分离{
@身份证
@列(unique=true,nullable=false,length=100)
私有字符串m_用户;
@OneToMany(mappedBy=“m_sTable”,cascade={CascadeType.ALL},fetch=FetchType.LAZY,orphan=true)
私立母校;
@OneToMany(mappedBy=“m_sTable”,cascade={CascadeType.ALL},fetch=FetchType.LAZY,orphanRemoving=true,targetEntity=ParentClass.class)
私人设置m_儿童;
等
}

m_id
的范围更改为
protected

protected Long m_id;

事实证明,我们的一个util类正在为扩展抽象Hibernate类的每个类寻找Id字段。因为子类没有
@Id
注释,所以它被炸毁了


只需添加一个简单的检查,查看是否存在父类,如果存在,则从那里获取带注释的字段。

我猜您只是省略了
@javax.persistence.Entity
注释?这可能无法解决您的问题,但父类应该是抽象的,特别是如果您不想使用该类创建实体。然后应使用
@MappedSuperclass
对该父类进行注释。如果父类是常规实体,Hibernate有时会在从代理对象获取正确的实体类型时遇到问题。我想有一些问题提到了这个问题。@Wolfram-当这两个类都被分离出来(每个类中都有重复的变量)时,我所需要的只是
@Table
,而我没有任何问题。所以为了回答你的问题,我从来没有使用过
@javax.persistence.Entity
注释。@Tom-我以前见过
@MappedSuperclass
使用过,但在适用时我不是100%。我确实希望创建具有父类和子类的实体。编辑:我收回那句话,汤姆。阅读文档后,我读到:
映射的超类没有为其定义单独的表。
这表明它不适用于我的情况。