Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Hibernate : How override an attribute from mapped super class

Tags:

The generic entity, super class:

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

The pojo:

@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;} } 

I try to use thoses annotations : @AttributeOverride, @Id, ... but It doesn't work. Can you help me? I want to override the attribute "id" to specify another column name and a sequence by pojo/table. What is the best way to do that?

like image 798
BasicCoder Avatar asked Mar 10 '11 09:03

BasicCoder


People also ask

How to override attributes from embedded class in hibernate?

Overriding an attribute mapping You can use the @AttributeOverride annotation on the Book entity to override the mapping of each attribute defined by the Publication class. You only need to provide the name of the attribute for which you want to change the mapping and a @Column annotation.

What is attribute override?

May be applied to an entity that extends a mapped superclass or to an embedded field or property to override a basic mapping or id mapping defined by the mapped superclass or embeddable class (or embeddable class of one of its attributes).

What is Mappedsuperclass?

A mapped superclass is a special type of class that is not persistent itself, but has subclasses that are persistent. A mapped superclass is useful for defined a common persistence superclass that defines common behavior across a set of classes, such as an id or version attribute.


2 Answers

Try this, instead

@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;} } 
like image 108
Adeel Ansari Avatar answered Nov 02 '22 03:11

Adeel Ansari


Why don't you annotate the id of GenericEntity with @Id? You also should not redefine id but put the @AttributeOverride(name = "id", column = @Column(name = "ID")) on the class rather than a field.

Edit:

We're using this in our base class (package.OurTableGenerator is our own implementation):

@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; 

This let's us specify a differenc block size and sequence per entity/table.

For your own table generator you could subclass org.hibernate.id.TableGenerator.

like image 41
Thomas Avatar answered Nov 02 '22 03:11

Thomas