【问题标题】:Hibernate : How override an attribute from mapped super classHibernate:如何覆盖映射超类的属性
【发布时间】:2011-07-12 14:10:05
【问题描述】:

通用实体,超类:

@MappedSuperclass
public abstract class GenericEntity {
    private Integer id;
    public Integer getId() {return id;}
    public void setId(Integer id) {this.id = id;}
}

宝乔:

@Entity
@Table(name = "POJO_ONE")
@SequenceGenerator(name = "HB_SEQ_POJO_ONE", sequenceName = "SEQ_POJO_ONE", allocationSize = 1)
public class PojoOne extends GenericEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "HB_SEQ_POJO_ONE")
    @Column(name = "ID")
    @AttributeOverride(name = "id", column = @Column(name = "ID"))
    private Integer id;

    @Override
    public Integer getId() {return id;}
}

我尝试使用这些注释:@AttributeOverride、@Id、...但它不起作用。你能帮助我吗? 我想覆盖属性“id”以通过 pojo/table 指定另一个列名和序列。 最好的方法是什么?

【问题讨论】:

标签: java hibernate annotations overriding mappedsuperclass


【解决方案1】:

为什么不用@Id 注释GenericEntity 的id? 您也不应该重新定义id,而是将@AttributeOverride(name = "id", column = @Column(name = "ID")) 放在类而不是字段上。

编辑:

我们在我们的基类中使用它(package.OurTableGenerator 是我们自己的实现):

@GeneratedValue ( generator = "ourTableGenerator", strategy = GenerationType.TABLE )
@GenericGenerator ( name = "ourTableGenerator", strategy = "package.OurTableGenerator",
  parameters = { @Parameter ( name = OurTableGenerator.TABLE_PARAM, value = "t_sequence" ),
                 @Parameter ( name = OurTableGenerator.SEGMENT_COLUMN_PARAM, value = "c_entity" ),
                 @Parameter ( name = OurTableGenerator.VALUE_COLUMN_PARAM, value = "c_nextHi" ),
                 @Parameter ( name = OurTableGenerator.INCREMENT_SIZE_COLUMN_PARAM, value = "c_blocksize" ) } )
@Id
@Column(name = "c_uid")
private Long uid;

这让我们为每个实体/表指定不同的块大小和顺序。

对于您自己的表格生成器,您可以继承 org.hibernate.id.TableGenerator

【讨论】:

  • 如何按表/实体为 id 指定序列?
  • 如果能把OurTableGenerator类的源码贴出来就好了
  • @KiranKumar 确切的代码取决于 Hibernate 版本,但基本上它是 org.hibernate.id.enhanced.TableGenerator 的子类和一些被覆盖的方法,尤其是 configure(...)generate(...) 以及提供 SQL 的方法字符串。
【解决方案2】:

试试这个吧

@MappedSuperclass
public abstract class GenericEntity {
    protected Integer id;
    ...

    public Integer getId() {return id;}
    public void setId(Integer id) {this.id = id;}
}


@Entity
@Table(name = "POJO_ONE")
@SequenceGenerator(name = "HB_SEQ_POJO_ONE", sequenceName = "SEQ_POJO_ONE", allocationSize = 1)
@AttributeOverride(name = "id", column = @Column(name = "ID"))
public class PojoOne extends GenericEntity {
    // we should not define id here again
    ...

    @Override
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "HB_SEQ_POJO_ONE")
    public Integer getId() {return id;}
}

【讨论】:

  • 使用这个解决方案,当我尝试保存时,我有这个异常:org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save()
  • @user616564:然后只需将@GeneratedValue 注释带到MappedSuperClass,但是子类将无法提供自己的实现。如果你没问题的话。
  • 这里的答案——stackoverflow.com/questions/8589928/… 提供了我认为稍微好一点的方法,因为它复制的代码更少。
  • 不会覆盖 getter,getId(),不可能吗? id 在 GenericEntity 中是私有的,因此孩子无法访问该属性。
  • @user2360507:已修复。谢谢。原来的帖子里有,我想我是在这里复制的。
猜你喜欢
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-24
相关资源
最近更新 更多