2

基本上我无法通过在搜索选项卡中粘贴根异常“ @NaturalId 仅在根实体(或其@MappedSuperclasses)上有效”在谷歌中找到一些类似的问题。我正在使用加入的多表继承策略将我的具体/子实体StudentEmployee),包括他们的抽象父Person)映射到我数据库中的三个表,到目前为止我从来没有遇到过问题,直到我意识到我需要使用学生的studentId为我的学生实体实现自定义查询. 我设法从实体管理器中提取了底层的 Hibernate-session,现在我可以清楚地看到并使用我心爱的 HibernateSession 中需要的方法(我们都知道 Hibernate 有用于 naturalIds 的方法,例如(byId、byNaturalId 等)。 ),并且这些方法对于查询实体真的非常有用。所以我只是用@NaturalId注释我的studentId 数据成员,直到.. 我执行了一些操作(保存/创建),然后向我抛出多行异常。而根本原因是..

 org.hibernate.AnnotationException: @NaturalId only valid on root entity (or its @MappedSuperclasses)

我将粘贴我的实体的代码以获取更多信息

Parent 抽象基

人物

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="PERSON_TYPE")
@Table(name="PERSON")
public abstract class Person {

@Id
@GeneratedValue
@Column(name="person_ent_id", insertable = false)
private int personId;

@Column(name = "first_name")
private String firstName;

@Column(name = "last_name")
private String lastName;

@Column(name = "age")
private int age;

@Column(name = "postal_id")
private String postalId;

.. getter and setter methods declarations

实体子

学生

@Entity
@Table(name = "STUDENT")
@DiscriminatorValue("S")
@PrimaryKeyJoinColumn(name = "student_ent_id", referencedColumnName = "person_ent_id")
public class Student extends Person {

@Column (name = "student_ent_id", insertable=false, updatable=false)
private int studentEntId;

@NaturalId
@Column(name = "school_id")
private String schoolId;

@Column(name = "school_name")
private String shoolName;

public Student() {
    super();
}

...getter and setter methods declarations

问题:我可以做些什么来对不同的学生实体进行唯一查询吗?因为 Hibernate 的 naturalId 方法对于执行诸如 get 或 update 等实体的操作非常有用

是否有任何解决方法可以在不牺牲实体和数据库表的设计的情况下完成我想要的工作?如果可能的话,我希望 studentId 充当 naturalId 。请有任何建议/帮助/意见。任何事情都将不胜感激。

4

1 回答 1

2

不,不幸的是,这是不可能的。我认为这是因为您只能在整个表上进行 NaturalId 查询,所以它需要在根实体上。但是,如果您只想确保 schoolId 对于所有可以使用的学生都是唯一的@Column(name = "school_id", unique = true)

于 2014-10-31T09:45:31.280 回答