GenerationType.SEQUENCE不会在hibernate中生成序列



这是我的实体文件:-

@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的情况下,它给了我一个错误:-

由:javex .persistence. persistenceexception: [PersistenceUnit: default]造成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.EntityManagerFactoryBuilderImpl执行4.美元(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)org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet (AbstractEntityManagerFactoryBean.java: 318)org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods (AbstractAutowireCapableBeanFactory.java: 1627)org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean (AbstractAutowireCapableBeanFactory.java: 1564)…42更多原因:org.hibernate.MappingException: Could not instantiate id generator [entity-name=com.alstom.autofie.entity. articlefunctioninstructionstatuts]org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.createIdentifierGenerator (DefaultIdentifierGeneratorFactory.java: 123)org.hibernate.mapping.SimpleValue.createIdentifierGenerator (SimpleValue.java: 213)在org.hibernate.internal.SessionFactoryImpl。(SessionFactoryImpl.java: 323)org.hibernate.cfg.Configuration.buildSessionFactory (Configuration.java: 1859)org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl执行4.美元(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的情况下,它在插入多个记录时给我一个错误,因为它一直生成相同的键,而不是顺序键。

DEBUG IdentifierGeneratorHelper -本地生成的标识:0

我在sql server中验证过,AFIS_Sequence每次都在生成序列。这意味着hibernate配置存在一些问题。

在使用

时,是否有遗漏的配置或者是hibernate的bug ?

@GeneratedValue(strategy=GenerationType.AUTO)

您正在使用具有休眠的自动增量,但是如果您使用

@GeneratedValue(strategy=GenerationType.IDENTITY)

您将使用数据库的自动增量

CustomSQLDialect应该扩展SQLServer2012Dialect,因为以前的版本不支持序列。

根据Hibernate。我们有X文档:

GeneratorType。汽车这是默认策略,并且可以跨不同的数据库移植。Hibernate根据数据库选择合适的ID。

对于GeneratorType.AUTO,您的表必须有一个Auto Incremented Primary Key

我们还有:

GeneratorType。序列一些数据库提供了一种序列号机制,所以这个设置将允许Hibernate使用序列号。

我看到的是你没有正确指定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;
...
}

您需要在数据库中创建一个Sequence,并将其指定给bean。

编辑:

我正在添加更多信息:

策略被定义为SEQUENCE,并相应地给生成器一个引用到序列生成器empSeqGen,它引用数据库中的序列对象。使用@SequenceGenerator,我们引用EMP_SEQ_GEN,这是一个序列对象在数据库中创建。

尝试使用@GeneratedValue(strategy=GenerationType.IDENTITY)

但我建议了解每个人的作用:

  • AUTO:指示持久性提供程序应该选择一个
  • IDENTITY:表示持久化提供者必须分配primary
  • SEQUENCE:表示持久化提供者必须分配primary
  • TABLE:表示持久化提供者必须分配primary键为实体使用底层数据库表来确保独特性。

更多信息请访问文档。

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

最新更新