2011-03-10 11 views
16

Podmiot rodzajowe, super klasę:Hibernacja: Jak zastąpić atrybut z odwzorowanym super klasy

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

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

próbuję użyć thoses adnotacji: @AttributeOverride, @Id, ... ale to nie działa. Możesz mi pomóc? Chcę zastąpić atrybut "id", aby określić inną nazwę kolumny i sekwencję według pojo/table. Jaki jest najlepszy sposób na zrobienie tego?

+0

http://opensource.atlassian.com/projects/hibernate/browse/HHH-4380 – axtavt

Odpowiedz

28

Spróbuj zamiast

@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) 
@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;} 
} 
+0

Dzięki temu rozwiązaniu, gdy próbuję zapisać, mam ten wyjątek: 'org.hibernate.id.IdentifierGenerationException: identyfikatory ids dla tej klasy muszą być ręcznie przypisane przed wywołaniem save()' – BasicCoder

+0

@ user616564: Następnie weź '@GeneratedValue 'adnotacja do' MappedSuperClass', ale wtedy podklasy nie będą w stanie dać własnej implementacji. Jeśli ci to nie przeszkadza. –

+0

A jak mogę określić sekwencję według tabeli/encji dla id? – BasicCoder

4

Dlaczego nie dodać adnotacji do id GenericEntity z @Id? Nie powinieneś również redefiniować id, ale zamiast tego wstawić klasę @AttributeOverride(name = "id", column = @Column(name = "ID")).

Edit:

Używamy tego w naszej klasie bazowej (package.OurTableGenerator jest nasza własna realizacja):

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

To pozwoli to nam określić rozmiar bloku differenc i sekwencję jednego podmiotu/tabeli.

Dla własnego generatora tabel można podklasę org.hibernate.id.TableGenerator.

+0

i jak mogę określić kolejność w tabeli/podmiot na id? – BasicCoder

+0

Dodałem kod, którego używamy do sekwencji na tabelę. – Thomas

+0

Będzie świetnie, jeśli umieścisz kod źródłowy klasy OurTableGenerator –

Powiązane problemy