2014-07-02 24 views
2

当我使用table-per-subclass策略时,我的基类(父类)包含复合主类。每个子类在表中生成Hibernate子类ID

@Column(nullable = false) 
@Id 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "XXX") 
@SequenceGenerator(name = "XXX", sequenceName = "XXX", allocationSize = 1) 
private Long systemId; 

@Id 
@Column(nullable = false) 
private Long version; 

所以,所有扩展这个(我知道它)的实体都继承了id和它的注释属性。 问题是,当我创建一个新的父实体,主要是从序列创建,那没关系。但是当我创建子类实例时,它增加了我不需要的父级ID(从seq创建一个新的主级),`因为我使用table-per-subclass和primary gottta是相同的。

问:如何在子类中抑制id代?

@Entity 
@PrimaryKeyJoinColumns(
    { 
      @PrimaryKeyJoinColumn(name = "systemId"), 
      @PrimaryKeyJoinColumn(name = "version") 
    } 
) 
public class SUb extends Parent { 

public SUb (Parent t) { 
    super(t); 
} 

public SUb() { 
} 
... 

... no ids... 

回答

0

当子类是创建它会发出两个插件:

  1. 一个基类
  2. 一个在子类

子类不继承@Ids,但它使用:

  • s ystemId
  • 版本

为FK到基表的相关列。

因此,尽管基类有那些两列组成的主键:

  • 产生的systenId
  • 手动分配的版本的序列

子类应具备:

  • 带FK的sequnceId列到基础sequnceId列
  • 与FK版本列的基础版本列

所以,当插入一个子类实体的顺序不应该被称为两次。

您能否确认数据库表是否遵循此设计?

+0

是的,但我没有@子类中的ID。冬眠甚至不能允许。我有PrimaryKeyJoinColumns 2列我的化合物PK – user2709715

+0

我认为第二个是从子类。在这种情况下,分配第二列标识符。 –

+0

请发布基地和子类进一步检查。 –

0

我无法设法重现您的问题。你能更具体地说明你的加入策略是什么?它是InheritanceType.TABLE_PER_CLASS还是InheritanceType.JOINED?尽管如此,我仍然设法使用TABLE-PER-CLASS连接策略来编写完整的示例,当您坚持使用SubDepartment时,它只会增加一次序列。也许它有帮助。

@Entity 
@IdClass(CompoundPK.class) 
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 
public class Department { 

    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "XXX") 
    @SequenceGenerator(name = "XXX", sequenceName = "XXX", allocationSize = 1) 
    @Id 
    private Long id; 

    @Id 
    private Long version; 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public Long getVersion() { 
     return version; 
    } 

    public void setVersion(Long version) { 
     this.version = version; 
    } 
} 


@Entity 
public class SubDepartment extends Department { 

    private String name; 

    public String getName() { 
     return name; 
    } 

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

public class CompoundPK implements Serializable { 
    private Long id; 
    private Long version; 

    public CompoundPK() { 
    } 

    public CompoundPK(Long id, Long version) { 
     this.id = id; 
     this.version = version; 
    } 

    public Long getId() { 
     return id; 
    } 

    public Long getVersion() { 
     return version; 
    } 

    // hashCode & equals 
}