2015-09-22 2 views
0

Это мой файл сущность: -GenerationType.SEQUENCE не генерирует последовательность в спящем режиме

@Entity 
@Table(name = "tbl_article_function_instruction_status") 
@XmlRootElement 

public class ArticleFonctionInstructionStatuts extends BaseEntity implements Serializable 
{ 
    private static final long         serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "AFIS_Sequence") 
    @SequenceGenerator(allocationSize = 5000, name="AFIS_Sequence", sequenceName="AFIS_Sequence") 
    @Basic(optional = false) 
    @Column(name = "art_fun_ins_status_id") 
    private Integer            afiStaIndex; 

    @Basic(optional = false) 
    @Column(name = "art_fun_ins_status_date") 
    @Temporal(TemporalType.TIMESTAMP) 
    private Date            afiStaDate; 

} 

Я попытался GenerationType.SEQUENCE & GenerationType.AUTO.
Но в случае GenerationType.SEQUENCE, он дает мне ошибку: -

Вызванный: javax.persistence.PersistenceException: [PersistenceUnit: по умолчанию] Не удалось построить гибернации SessionFactory в org.hibernate.jpa.boot. internal.EntityManagerFactoryBuilderImpl.persistenceException (EntityManagerFactoryBuilderImpl.java:1239) в org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.access $ 600 (EntityManagerFactoryBuilderImpl.java:120) в org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl $ 4. выполнить (EntityManagerFactoryBuilderImpl.java:855) на org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderIm пл $ 4.perform (EntityManagerFactoryBuilderImpl.java:845) в org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl (ClassLoaderServiceImpl.java:398) в org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build (EntityManagerFactoryBuilderImpl.java:844) на org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory (SpringHibernateJpaPersistenceProvider.java:60) на org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory (LocalContainerEntityManagerFactoryBean.java:343) at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet (AbstractEntityManagerFactoryBean.java:318) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFacto ry.invokeInitMethods (AbstractAutowireCapableBeanFactory.java:1627) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean (AbstractAutowireCapableBeanFactory.java:1564) ... 42 более Вызванный: org.hibernate.MappingException: Не могли Генератор идентификаторов экземпляров [entity-name = com.alstom.autofie.entity.ArticleFonctionInstructionStatuts] at org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.createIdentifierGenerator (DefaultIdentifierGeneratorFactory.java:123) at org.hibernate.mapping.SimpleValue. createIdentifierGenerator (SimpleValue.java:213) at org.hibernate.internal.SessionFactoryImpl. (SessionFactoryImpl.java:323) at org.hibernate.cfg.Configuration.buildSessionFactory (Configuration.java:1859) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl $ 4.perform (EntityManagerFactoryBuilderImpl.java:852) ... 50 еще Вызвано: org.hibernate.MappingException: com.alstom.autofie2.dao.CustomSQLDialect не делает опорные последовательности на org.hibernate.dialect.Dialect.getSequenceNextValString (Dialect.java:882) на org.hibernate.id.SequenceGenerator.configure (SequenceGenerator.java:110) в org.hibernate.id.SequenceHiLoGenerator.configure (SequenceHiLoGenerator.java:55) в org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.createIdentifierGenerator (DefaultIdentifierGeneratorFactory.java:117) ... 54 более

Здесь CustomSQLDialect - это класс, который расширяет SQLServerDialect.

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

ОТЛАДКА IdentifierGeneratorHelper - Нативно генерироваться идентичность: 0

Я проверил в SQL Server, AFIS_Sequence генерирует последовательность каждый раз. Это означает, что есть некоторые проблемы с конфигурацией спящего режима.

Есть ли какая-либо конфигурация пропущена или это ошибка спящего режима?

ответ

1

CustomSQLDialect должен распространять SQLServer2012Dialect, поскольку предыдущие версии не поддерживали последовательности.

1

Согласно 4.x документации Hibernate мы имеем:

GeneratorType.AUTO Это стратегия по умолчанию, и переносим на различных базах данных. Hibernate выбирает соответствующий идентификатор на основе базы данных.

Для GeneratorType.AUTO ваш стол должен иметь Auto Incremented Primary Key.

Мы также:

GeneratorType.SEQUENCE Некоторые базы данных обеспечивают механизм упорядоченных чисел, так что эта настройка позволит Hibernate использовать порядковый номер.

Что я могу видеть, что вы не указали правильно, который sequente Hibernate должен использовать, следовать этому примеру:

public class Employee { 
@Id 
@Column(name="EMPLOYEE_ID") 
@GeneratedValue (strategy= GenerationType.SEQUENCE, generator="empSeqGen") 
@SequenceGenerator(name = "empSeqGen", sequenceName = "EMP_SEQ_GEN") 
private int employeeId =0; 
... 
} 

Вам нужно создать последовательность в вашей базе данных и указать его к фасоли ,

Редактировать:

Я добавить больше информации:

Стратегия определена как последовательность, и, соответственно, генератор дается ссылка на генератор последовательности, empSeqGen, которая относится к объект последовательности в базе данных. Используя @SequenceGenerator, мы ссылаемся на EMP_SEQ_GEN, который представляет собой объект последовательности , созданный в базе данных.

+0

Я создал 'AFIS_Sequence' в базе данных. Мне нужно создать bean-компонент с именем 'empSeqGen'? – unknown

+1

Я отредактировал ответ, я добавил дополнительную информацию –

4

При использовании

@GeneratedValue(strategy=GenerationType.AUTO) 

Вы используете автоматическое приращение, что есть спящий режим, но если вы используете

@GeneratedValue(strategy=GenerationType.IDENTITY) 

Вы будете использовать автоматическое приращение вашей базы данных

-1
import java.util.Date; 
import javax.persistence.*; 

@Entity 
@Table(name="driver_license") 
public class DriverLicense extends License { 
private String driverLicenseName; 
@Temporal(TemporalType.DATE) 
private Date driverLicenseExpiryDate; 
@Temporal(TemporalType.DATE) 
private Date driverLicenseIssueDate; 


public String getDriverLicenseName() { 
    return driverLicenseName; 
} 
public void setDriverLicenseName(String driverLicenseName) { 
    this.driverLicenseName = driverLicenseName; 
} 
public Date getDriverLicenseExpiryDate() { 
    return driverLicenseExpiryDate; 
} 
public void setDriverLicenseExpiryDate(Date driverLicenseExpiryDate) { 
    this.driverLicenseExpiryDate = driverLicenseExpiryDate; 
} 
public Date getDriverLicenseIssueDate() { 
    return driverLicenseIssueDate; 
} 
public void setDriverLicenseIssueDate(Date driverLicenseIssueDate) { 
    this.driverLicenseIssueDate = driverLicenseIssueDate; 
} 
} 


import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.MappedSuperclass; 
import javax.persistence.SequenceGenerator; 

@MappedSuperclass 
public class License { 

@Id 
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="license_gen") 
@SequenceGenerator(name="license_gen",sequenceName="lic_seq_gen",initialValue=1,allocationSize=1) 
protected int id; 

public int getId() { 
    return id; 
} 

public void setId(int id) { 
    this.id = id; 
} 
} 


import org.hibernate.SessionFactory; 
import org.hibernate.boot.registry.StandardServiceRegistryBuilder; 
import org.hibernate.cfg.Configuration; 

public class HibernateUtil { 

private static SessionFactory sessionFactory ; 
static{ 
    Configuration configuration=new Configuration(); 
    configuration.addAnnotatedClass(DriverLicense.class); 
    // configuration.addAnnotatedClass(DriverLicense.class); 
    configuration.setProperty("connection.driver_class","org.postgresql.Driver"); 
    configuration.setProperty("hibernate.connection.url", "jdbc:postgresql://localhost:5432/test");         
    configuration.setProperty("hibernate.connection.username", "postgres");  
    configuration.setProperty("hibernate.connection.password", "postgres"); 
    configuration.setProperty("dialect", "org.hibernate.dialect.PostgreSQLDialect"); 
    configuration.setProperty("hibernate.hbm2ddl.auto", "update"); 
    configuration.setProperty("hibernate.show_sql", "true"); 
    configuration.setProperty(" hibernate.connection.pool_size", "10"); 


    StandardServiceRegistryBuilder registry=new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()); 
    sessionFactory=configuration.buildSessionFactory(registry.build()); 

} 

public static SessionFactory getSessionFactory() { 
     return sessionFactory; 
    } 
} 



public class Main { 

public static void main(String[] args) { 

    DriverLicense driverLicense=new DriverLicense(); 

    driverLicense.setDriverLicenseExpiryDate(new Date()); 
    driverLicense.setDriverLicenseName("License for all"); 
    driverLicense.setDriverLicenseIssueDate(new Date()); 

    Session session=HibernateUtil.getSessionFactory().openSession(); 

    try { 
     session.beginTransaction(); 

     session.save(driverLicense); 

     session.getTransaction().commit(); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 
} 
Смежные вопросы