2015-07-03 3 views
0

Я пытаюсь использовать Hibernate для обратной инженерии базы данных Oracle 11g. Я бы хотел, чтобы Hibernate генерировал значения для моих столбцов @Id, однако Oracle 11g не поддерживает столбцы идентификаторов. Поэтому аннотации @GeneratedValue создаются при обратном преобразовании базы данных.Hibernate - Reverse Engineer: Добавить @GeneratedValue ко всем полям @Id

Есть ли способ, чтобы процесс обратного проектирования автоматически включал аннотацию @GeneratedValue рядом с каждой аннотацией @Id? .

@Id 
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="identity_sequence") 

Единственный способ, который я смог найти, чтобы сделать это, чтобы включить запись в моем reveng.xml для каждой отдельной таблицы. Я пытаюсь избежать этого подхода из-за количества таблиц в базе данных (100).

I.e.

<table name="{table name}"> 
    <primary-key> 
     <generator class="GenerationType.SEQUENCE"> 
      <param name="sequence">IDENTITY_SEQ</param> 
     </generator> 
     <key-column name="ID"/> 
    </primary-key> 
</table> 

Повторно 100 раз.

ответ

1

Я нашел ответ на свой вопрос в форуме this.

В принципе, вы должны предоставить класс custom reverse engineering strategy.
Там вы реализуете метод getTableIdentifierStrategyName, который возвращает полное имя класса, реализующего org.hibernate.id.IdentifierGenerator. Вы можете использовать параметр identifier этого метода, чтобы дополнительно ограничить класс генератора определенными таблицами.
Пример, описанный ниже, будет использовать генератор идентификаторов последовательности для всех таблиц.

public class CustomReverseEngineeringStrategy extends DelegatingReverseEngineeringStrategy { 

    public CustomReverseEngineeringStrategy(ReverseEngineeringStrategy delegate) { 
     super(delegate); 
    } 

    public String getTableIdentifierStrategyName(TableIdentifier identifier) { 
     return org.hibernate.id.enhanced.SequenceStyleGenerator.class.getName(); 
    } 
} 

Укажите эту стратегию в своей задаче обратной инженерной задачи JDBCConfiguration.

jdbcconfiguration(propertyfile: "hibernate.properties", 
        packagename: "de.mypackage", 
        reversestrategy: "de.mypackage.CustomReverseEngineeringStrategy", 
        detectManytoMany: true, 
        detectOptimisticLock: false) 

Это будет генерировать @GeneratedValue аннотации рядом с каждым @Id аннотации, как показано ниже:

@GenericGenerator(name = "generator", strategy = "org.hibernate.id.SequenceIdentityGenerator") 
@Id 
@GeneratedValue(generator = "generator") 
@Column(name = "id", unique = true, nullable = false) 
public Integer getId() { 
    return this.id; 
} 
0

Предупреждение - это не элегантное решение

Использование Maven:

1) перепроектировать базы данных обычно:

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>hibernate3-maven-plugin</artifactId> 
    ... 

2) Заменить @Id и импорт с желаемый код:

<plugin> 
    <groupId>com.google.code.maven-replacer-plugin</groupId> 
    <artifactId>replacer</artifactId> 
    ... 
    <replacements> 
    <replacement> 
     <token>@Id</token> 
     <value>@Id 
     @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="identity_sequence") 
     @SequenceGenerator(name="identity_sequence", 
          sequenceName="IDENTITY_SEQ", allocationSize=20) 
     </value> 
    </replacement> 
    <replacement> 
     <token>import javax.persistence.Id;</token> 
     <value>import javax.persistence.Id; 
     import javax.persistence.GeneratedValue; 
     import javax.persistence.GenerationType; 
     import javax.persistence.SequenceGenerator; 
     </value> 
    </replacement> 

3) Привод код генерации:

<plugin> 
    <groupId>com.googlecode.maven-java-formatter-plugin</groupId> 
    <artifactId>maven-java-formatter-plugin</artifactId> 
    ... 

Для решения этой проблемы существует множество недостатков. Например, если у вас есть какие-либо представления (или что-либо еще, у которого нет числового первичного ключа), тогда нет смысла заменять @Id.

Надеюсь, это не лучший ответ в течение очень долгого времени.

Смежные вопросы