2017-02-18 31 views
1

Имея 2 классов сущностей для двух различных таблиц базы данных, Table1.java, который имеет идентификаторы вручную генерироваться и Table2.java что последовательность генерируемых идентификаторов, можно переместить свойство Ид, @Id и @Column аннотаций, и геттеры & сеттеры для id для универсального суперкласса и оставляют @GeneratedValue и @SequenceGenerator внутри подклассов, которые им нужны? Решение должно быть масштабируемо для сотен таблиц двух типов и не должно разделять суперкласс класса GenericTable в двух классах.Hibernate реорганизовать @Id поля в суперкласс

Проблема заключается в том, что @GeneratedValue работает только на уровне поля/методы, поэтому он должен быть перемещен в суперкласс делает все подклассы обязательных для реализации @SequenceGenerator, который конфликтует с Table1.java характеристиками.

@Entity 
@Table(name = "TABLE1") 
public class Table1 extends GenericTable { 

    @Id 
    @Column(name = "ID", nullable = false, precision = 22, scale = 0) 
    private Long id; 

    // other properties 
    // getters & setters for id 
    // other getters & setters 
} 

@Entity 
@Table(name = "TABLE2") 
public class Table2 extends GenericTable { 

    @Id 
    @GeneratedValue(strategy = SEQUENCE, generator = "generator") 
    @SequenceGenerator(name = "generator", sequenceName = "TABLE2_SEQ", allocationSize = 1) 
    @Column(name = "ID", nullable = false, precision = 22, scale = 0) 
    private Long id; 

    // other properties 
    // getters & setters for id 
    // other getters & setters 
} 

@MappedSuperclass 
public abstract class GenericTable { 

} 

ответ

1

Я не думаю, что его можно перестроить эти два типа конфигурации в одном классе.

Я сделал несколько тестов, и с двумя @MappedSuperclass лицами вы должны быть в состоянии достичь решения, которое отвечает вашим многоразовые/масштабируемые потребности:

Basic Id родительского типа

@MappedSuperclass 
public abstract class BasicIdAwareEntity implements Serializable { 

    protected Long id; 

    @Id 
    @Column(name = "ID", nullable = false, precision = 22, scale = 0) 
    public Long getId() { 
     return id; 
    } 

последовательности Id вариацию родственный

@MappedSuperclass 
public abstract class SequenceIdAwareEntity extends BasicIdAwareEntity { 

    @Override 
    @Id 
    @GeneratedValue(strategy = SEQUENCE, generator = "generator") 
    @SequenceGenerator(name = "generator", sequenceName = "TABLE2_SEQ", allocationSize = 1) 
    public Long getId() { 
    return super.getId(); 
    } 

Бетонные Сущности

@Entity 
@Table(name = "TABLE1") 
public class Table1 extends BasicIdAwareEntity { 

и

@Entity 
@Table(name = "TABLE2") 
public class Table2 extends SequenceIdAwareEntity { 

Теперь, если вам необходимо реорганизовать это отображение в какой-то момент в будущем, например, вы должны изменить точность столбца идентификаторов, то вам просто внести изменения в класс BasicIdAwareEntity. То же самое касается изменения типа, которое с помощью хорошей среды IDE также должно изменять подклассы.

Единственная аннотация, которую нужно разместить во всех абстрактных классах - это @Id.

Если вам нужен другой генератор для определенной таблицы в будущем, тогда вы просто создадите другой подкласс BasicIdAwareEntity.

+0

У меня есть еще 2 вопроса для вас: 1. Если бы у вас было бы больше таблиц, например Table2, но с другим именем последовательности, как бы вы изменили свой пример. 2. Если у вас будет больше суперклассов, таких как Dictionary (есть метки и свойства статуса), аудита (имеет больше столбцов) и т. Д., Вы в конечном итоге дублируете каждый абстрактный тип для каждого типа, поддерживающего последовательность и не поддерживающие последовательность. Как бы вы реорганизовали этот случай? – pXel