错误:无法通过 <union-subclass> (TABLE_PER_CLASS) 使用标识列键生成

Posted

技术标签:

【中文标题】错误:无法通过 <union-subclass> (TABLE_PER_CLASS) 使用标识列键生成【英文标题】:Error : Cannot use identity column key generation with <union-subclass> ( TABLE_PER_CLASS ) 【发布时间】:2014-01-29 14:16:00 【问题描述】:

我正在使用 Hibernate 来保存所有实体都继承自基本抽象实体的实体。对于所有具体实体,分别有数据库表,具有自动增量主键列。但是使用 GenerationType 作为“AUTO”或“IDENTITY”会出错。我希望代表每个具体实体类的数据库表中的所有记录都应该具有顺序递增的 ID 值。

com.something.SuperClass:

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class SuperClass implements Serializable 
    private static final long serialVersionUID = -695503064509648117L;

    long confirmationCode;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO) // Causes exception!!!
    public long getConfirmationCode() 
        return confirmationCode;
    

    public void setConfirmationCode(long confirmationCode) 
        this.confirmationCode = confirmationCode;
    

com.something.SubClass:

@Entity
public abstract class Subclass extends SuperClass 
    private static final long serialVersionUID = 8623159397061057722L;

    String name;

    @Column(nullable = false)
    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

给我这个例外:

Caused by: org.hibernate.MappingException: Cannot use identity column key
generation with <union-subclass> mapping for: com.something.SuperClass
What's the best and most convenient way for me to generate the ID's? I do not want to change my inheritance strategy.

我知道如果我将 GenerationType 从“AUTO”更改为“TABLE”,可以解决这个问题,但是这个解决方案的问题是,生成的密钥的顺序不准确。它在键之间留下了很大的间隙。

我正在寻找允许所有表使用由 mysql AutoIncrement 主列生成的 Auto Incremental 值的解决方案。

在此先感谢大家。

P.S.:我已经看过以下帖子: Cannot use identity column key generation with <union-subclass> ( TABLE_PER_CLASS )

【问题讨论】:

Cannot use identity column key generation with <union-subclass> ( TABLE_PER_CLASS )的可能重复 我也有同样的问题。你有没有发现任何线索? 【参考方案1】:

这里的问题是你混合了“每个类的表”继承和 GenerationType.Auto。在“每类表”策略中,每个类使用一个表,每个表都有一个 ID。

我遇到了同样的问题,我通过将 @GeneratedValue(strategy = GenerationType.TABLE) 替换为 GenerationType.TABLE 解决了这个问题

最终代码如下所示

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class SuperClass implements Serializable 
    private static final long serialVersionUID = -695503064509648117L;

    long confirmationCode;

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    public long getConfirmationCode() 
        return confirmationCode;
    

    public void setConfirmationCode(long confirmationCode) 
        this.confirmationCode = confirmationCode;
    

【讨论】:

以上是关于错误:无法通过 <union-subclass> (TABLE_PER_CLASS) 使用标识列键生成的主要内容,如果未能解决你的问题,请参考以下文章

无法通过 Java Maleorang 的 MailChimp API 3.0 包装器获取数据 - 404 错误

无法使用 d3.js 读取属性错误

由于配置文件不活动,Testflight 错误无法安装 <appname> WWDR 错误

MongoDB 展开错误:无法编码类型的对象:<class 'set'>

模板类无法编译通过,谁能帮我解释

无法通过意图传递Hashmap