2015-12-30 1 views
1

Могу ли я использовать генераторы несколько последовательностей для одного объекта, напримергенераторов несколько последовательностей Hibernate для одного объекта с PostgreSQL

@Id 
@SequenceGenerator(name=”subscription_id_seq”,sequenceName=”subscription_id_seq”, allocationSize=7) 
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator=”subscription_id_seq”) 
@Column(unique=true, nullable=false) 
private Integer id 

@Column(name="code", nullable=false, unique=true) 
@SequenceGenerator(name="subscription_code_1_seq",sequenceName="subscription_code_1_seq", allocationSize=7) 
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="subscription_code_1_seq") 
private Integer code; 

ответ

4

Нет, вы не можете. Генератор применим только для столбцов идентификатора.

Убедитесь, что вы создали эту последовательность с помощью сценария (например, hibernate.hbm2ddl.import_files):

create sequence subscription_code_1_seq start 1 increment 7 

Затем используйте отображение, как это:

@Id 
@SequenceGenerator(
     name="subscription_id_seq", 
     sequenceName="subscription_id_seq", 
     allocationSize=7 
) 
@GeneratedValue(
     strategy=GenerationType.SEQUENCE, 
     generator="subscription_id_seq" 
) 
@Column(unique=true, nullable=false) 
private Integer id; 

@Column(
     name="code", 
     nullable=false, 
     unique=true, 
     insertable = false, 
     updatable = false, 
     columnDefinition = "BIGINT DEFAULT nextval('subscription_code_1_seq')" 
) 
@Generated(GenerationTime.INSERT) 
private Integer code; 
+0

Он работал. Спасибо Владу! – Deepak

+0

Я рад, что смог помочь –

3

В двух словах, вы можете использовать несколько генераторов последовательностей для одного объекта, но для первичных ключей только (составной первичный ключ).

Из SequenceGenerator документации:

Определяет первичный генератор ключей, который может ссылаться по имени, когда элемент генератора задается для аннотирования GeneratedValue. Генератор последовательности может быть указан в классе сущности или в поле или свойстве первичного ключа. Объем имени генератора является глобальным для единицы сохранения (для всех типов генераторов).

Пример кода:

public class TestPK implements Serializable { 

    private Integer test1; 

    private Integer test2; 

    ... 
} 

@Entity 
@IdClass(TestPK.class) 
public class Test implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @SequenceGenerator(name = "seq_test1", sequenceName = "seq_test1", allocationSize = 7) 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_test1") 
    @Column(name = "test1", unique = true, nullable = false) 
    private Integer test1; 

    @Id 
    @Column(name = "test2", nullable = false, unique = true) 
    @SequenceGenerator(name = "seq_test2", sequenceName = "seq_test2", allocationSize = 7) 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_test2") 
    private Integer test2; 

    ... 

    @Override 
    public String toString() { 
     return "Test{" + 
       "test1=" + test1 + 
       ", test2=" + test2 + 
       '}'; 
    } 
} 

public interface TestRepository extends Repository<Test, String> { 

    Page<Test> findAll(Pageable pageable); 

    void save(Test test); 
} 

@SpringBootApplication 
public class Application implements CommandLineRunner { 

    @Autowired 
    private TestRepository testRepository; 

    @Override 
    public void run(String... args) throws Exception { 
     testRepository.save(new Test()); 
     Page<Test> all = testRepository.findAll(null); 
     System.out.println(all.iterator().next()); 
    } 

    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 
} 
Смежные вопросы