Java 迁移到Hibernate 4、@heritage和@GeneratedValue的误解

Java 迁移到Hibernate 4、@heritage和@GeneratedValue的误解,java,inheritance,orm,hibernate-annotations,hibernate-4.x,Java,Inheritance,Orm,Hibernate Annotations,Hibernate 4.x,我将我的web应用程序升级为使用Hibernate 4。在那之后,我遇到了一些问题,我需要帮助 我的域对象有一个基类,如下所示: @MappedSuperclass public class BaseDomainObject implements Serializable { @Id @GeneratedValue @Column protected Integer id; public Integer getId() { r

我将我的web应用程序升级为使用Hibernate 4。在那之后,我遇到了一些问题,我需要帮助

我的域对象有一个基类,如下所示:

@MappedSuperclass 
public class BaseDomainObject implements Serializable {

    @Id
    @GeneratedValue
    @Column
    protected Integer id;

    public Integer getId() {
            return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }
}
@Entity
@Table(name="[user]")
public class User extends BaseDomainObject {

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

    ....
}
然后,我有很多实体,比如:

@MappedSuperclass 
public class BaseDomainObject implements Serializable {

    @Id
    @GeneratedValue
    @Column
    protected Integer id;

    public Integer getId() {
            return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }
}
@Entity
@Table(name="[user]")
public class User extends BaseDomainObject {

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

    ....
}
我在实体之间有一些继承:

@Entity
@Table(name="record_data")
@Polymorphism(type=PolymorphismType.EXPLICIT)
public class RecordData extends BaseDomainObject {
    ....
}


@Entity
@Table(name="auto_data")
@Polymorphism(type=PolymorphismType.EXPLICIT)
public class AutoData extends RecordData {

}
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 
当我进行hql查询时,我得到了这个异常

 Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Invalid column name 'DTYPE'.
在hibernate源代码中,我看到,若实体有父hibernate,那个么默认情况下,它将采用单_表继承,所以在每个查询中,它将连接鉴别器列,但我并没有鉴别器列,因为每个类都映射到不同的表

为了解决此问题,我在实体上添加了此注释:

@Entity
@Table(name="record_data")
@Polymorphism(type=PolymorphismType.EXPLICIT)
public class RecordData extends BaseDomainObject {
    ....
}


@Entity
@Table(name="auto_data")
@Polymorphism(type=PolymorphismType.EXPLICIT)
public class AutoData extends RecordData {

}
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 
但在那之后,我得到了另一个解释

Caused by: org.hibernate.MappingException: Cannot use identity column key generation with <union-subclass> mapping for: bla.bla.RecordData
但这导致了另一个例外

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Invalid object name 'hibernate_sequences'.
我的数据库中的所有表都有一个自动递增id。。所以我不想让hibernate管理它

我错过了什么吗?

一些解释:

Caused by: org.hibernate.MappingException: Cannot use identity column
key generation with <union-subclass> mapping for: bla.bla.RecordData
您已经将ID生成策略设置为TABLE,但由于某些原因,hibernate没有创建一个表来存储这些ID。您需要手动创建它,或者找出hibernate为什么不在启动时创建它

一些建议:

  • 标识列和继承并不像您尝试过的那样好用。您可能应该尝试@heritance(strategy=InheritanceType.JOINED),因为这将为基类创建一个带有标识列的表,并将其余属性存储在其他表中

  • 如果上述操作失败,请通过指定@GeneratedValue(strategy=GenerationType.SEQUENCE)使用序列


加入并不是解决方案。对于SEQUENCE,我得到“com.softrunner.init.srtsqlserverdialent不支持序列”。。所以我明白我应该回到Hibernate 3.可能太晚了,但是“加入”有什么问题吗?谢谢!解决我的问题的方法是我的hib 5 annot jpa映射类进行一些交互,但每个类都有自己的表/无鉴别器。。。InheritanceType.TABLE_每个_类