Java Hibernate继承-没有用Id注释的字段
我一直在读一些关于hibernate继承的书,但在将其应用到我的情况时遇到了困难 下面是我正在使用的3个类-每个类都应该有自己的表:Java Hibernate继承-没有用Id注释的字段,java,hibernate,inheritance,h2,Java,Hibernate,Inheritance,H2,我一直在读一些关于hibernate继承的书,但在将其应用到我的情况时遇到了困难 下面是我正在使用的3个类-每个类都应该有自己的表: 父类 儿童班 可分离 下面是我所展示的基本内容。但是,当我尝试在子类服务上运行测试时,它们都因java.lang.IllegalStateException:没有Id注释的字段而失败。现在,如果我正确理解了那篇文章/博客文章,我就不需要用Id注释ChildClass,因为它应该在父类中获取 我可能完全错了,因为我刚开始冬眠,但若你们有任何想法,我很高兴听到
- 父类
- 儿童班
- 可分离
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%。我确实希望创建具有父类和子类的实体。编辑:我收回那句话,汤姆。阅读文档后,我读到:映射的超类没有为其定义单独的表。
这表明它不适用于我的情况。