我试图将示例项目导入到eclipse中,并且在运行应用程序时面临以下给出的错误。
Caused by: org.hibernate.MappingException: org.hibernate.dialect.OracleDialect does not support identity key generation
at org.hibernate.dialect.Dialect.getIdentityColumnString(Dialect.java:743)
at org.hibernate.dialect.Dialect.getIdentityColumnString(Dialect.java:733)
at org.hibernate.mapping.Table.sqlCreateString(Table.java:426)
at org.hibernate.cfg.Configuration.generateSchemaCreationScript(Configuration.java:1028)
at org.hibernate.tool.hbm2ddl.SchemaExport.<init>(SchemaExport.java:125)
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:492)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1744)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1782)
at org.springframework.orm.hibernate4.LocalSessionFactoryBuilder.buildSessionFactory(LocalSessionFactoryBuilder.java:247)
at org.springframework.orm.hibernate4.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:373)
at org.springframework.orm.hibernate4.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:358)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1541)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1479)
... 32 more
根据this SO链接,我更改了
@GeneratedValue(strategy = GenerationType.IDENTITY)
到
@GeneratedValue(strategy = GenerationType.AUTO)
或@GeneratedValue(strategy = GenerationType.TABLE)
但没效果。
以下是代码:
User.java:
@Entity
@Table(name = "users")
@ManagedBean
@ViewScoped
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name = "username", nullable = false)
private String username;
@Column(name = "password", nullable = false)
private String password;
@Column(name = "role", nullable = false)
private String role;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
}
来自applicationContext.xml:
<!-- Session Factory Declaration -->
<bean id="SessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="DataSource" />
<property name="annotatedClasses">
<list>
<value>com.crud.model.User</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">create</prop>
</props>
</property>
</bean>
答案 0 :(得分:22)
你可以使用tell Hibernate来使用序列来生成你的ID
@Id
@Column(name = "ID")
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "id_Sequence")
@SequenceGenerator(name = "id_Sequence", sequenceName = "ID_SEQ")
private int id;
这个配置基本上告诉Hibernate使用一个名为ID_SEQ的数据库序列来生成该对象的ID。如果您需要其他唯一ID,可以在其他对象上指定其他序列,或者如果您希望在整个系统中使用全局唯一ID,则可以使用相同的序列。
唯一的缺点是无法执行批量插入(没有一些进一步的配置),因为Hibernate每次都需要从数据库中获取下一个序列值,如果你想使用它就不能使用这个配置MySQL数据库,因为它们不支持序列。
如果其中任何一个没有意义,请告诉我,我会进一步解释。
答案 1 :(得分:7)
我在使用OracleDB时也遇到了同样的问题,尝试了Identity,GenerateSequence,但没有任何解决方案。直到我必须在应用程序属性中更改方言。由于某种原因,方言无法生成正确的顺序,这就是为什么我决定对Oracle12c案例使用其他方言。
之前:
spring.jpa.database-platform = org.hibernate.dialect.Oracle10gDialect
然后:
spring.jpa.database-platform = org.hibernate.dialect.Oracle12cDialect
您可以验证连接方言中是否有价值,并将其更改为其他版本将像我一样解决。
答案 2 :(得分:1)
如果您只需要能够自动递增属性值(例如某些ID,即表的主键),则可以使用@GeneratedValue(strategy = GenerationType.TABLE)
。它对我有用。希望能帮助到你。
答案 3 :(得分:1)
我的声誉太低了...
嗯,我非常感谢JamesENL
我替换了
@GeneratedValue(strategy = GenerationType.IDENTITY)
通过
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "id_Sequence")
@SequenceGenerator(name = "id_Sequence", sequenceName = "ID_SEQ")`
效果很好
答案 4 :(得分:0)
而不是IDENTITY使用NATIVE并使用序列。 Link
答案 5 :(得分:0)
出现异常的原因是:
Hibernate希望底层数据库为给定属性提供自动递增功能,在您的情况下为id
。 IOW,Oracle(您的情况)应支持字段的自动递增功能。 Oracle开始使用12c version提供自动递增功能,并且由于您的版本较少,因此出现了该异常。
答案 6 :(得分:0)
您可以通过.identity
来更改.sequence
,它将起作用:
GeneratedValue(strategy=GenerationType.SEQUENCE)