我有以下结构的表格
CREATE TABLE "tblChecks"
(
"checkId" serial NOT NULL,
"bankId" text,
"checkNumber" text,
amount numeric(30,2)
)
我使用 hibernate 在数据库上进行事务我的问题是 随着数据的插入。我已经映射了我的 具有以下注释的模型
@Entity
@Table(name = "\"tblChecks\"")
public class Check {
/* Integereger values*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "\"checkId\"")
private Integer checkId;
@Column(name = "amount")
private Double amount;
/* String values*/
@Column(name = "\"bankId\"")
private String bankId;
@Column(name = "\"checkNumber\"")
private String checkNumber;
在我的插入方法中发生了错误
ERROR: org.hibernate.engine.jdbc.spi.SqlExceptionHelper - The column name "checkId" was not found in this ResultSet.
我的问题是如何使用 Postgres 修复主键上的这些错误。将列名更改为 checkid 将修复错误,但我不能这样做,因为这些表已在当前系统中使用。
最佳答案
我在您的 POJO 中发现的第一个错误是您在 PostgresSQL 中使用了自动递增。 hibernate 3.x 到 4.2 不支持此功能。因此,您无法在数据库中插入记录,并且可能会出现所谓的异常 org.hibernate.exception.SQLGrammarException: could not retrieve generated id after insert:
您可以使用 serial
或 sequence
代替它。 Serial Doc
更新的 POJO 类:我使用序列生成实体 ID 并实现了与 auto_increment 相同的功能。
package stack.filter;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
@Entity
@Table(name = "\"tblChecks\"")
public class Check implements Serializable
{
private static final long serialVersionUID = 1L;
/* Integereger values */
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="checkId_seq")
@SequenceGenerator(name="checkId_seq", sequenceName="checkId_seq", allocationSize=1)
@Column(name = "\"checkId\"")
private Integer checkId;
@Column(name = "amount")
private Double amount;
/* String values */
@Column(name = "\"bankId\"")
private String bankId;
@Column(name = "\"checkNumber\"")
private String checkNumber;
public Integer getCheckId()
{
return checkId;
}
public void setCheckId(Integer checkId)
{
this.checkId = checkId;
}
public Double getAmount()
{
return amount;
}
public void setAmount(Double amount)
{
this.amount = amount;
}
public String getBankId()
{
return bankId;
}
public void setBankId(String bankId)
{
this.bankId = bankId;
}
public String getCheckNumber()
{
return checkNumber;
}
public void setCheckNumber(String checkNumber)
{
this.checkNumber = checkNumber;
}
}
主要代码:
public static void main(String[] args) {
Session session = null;
Transaction tx = null;
try {
SessionFactory sessionFactory = HibernateUtil.getSessionAnnotationFactory();
session = sessionFactory.openSession();
tx = session.beginTransaction();
Check c1=new Check();
c1.setAmount(40555.4);
c1.setBankId("AC11112");
c1.setCheckNumber("CK12222CD");
Check c2=new Check();
c2.setAmount(50555.4);
c2.setBankId("AC11111");
c2.setCheckNumber("CK12233EW");
session.persist(c1);//Insert check object c1
session.persist(c2);//Insert check object c2
tx.commit();
System.out.println("After commit");
} catch (RuntimeException e) {
try {
tx.rollback();
} catch (RuntimeException rbe) {
System.err.println("Couldn’t roll back transaction"+ rbe);
}
throw e;
} finally{
if(session != null){
session.close();
}
}
System.out.println("Success");
}
hibernate.cfg.xml 文件:确保 hibernate.dialect
是 org.hibernate.dialect.PostgreSQLDialect
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="hibernate.connection.driver_class">org.postgresql.Driver</property><!-- com.mysql.jdbc.Driver -->
<property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/postgres?createDatabaseIfNotExist=true</property> <!-- jdbc:mysql://localhost:5432/postgres?createDatabaseIfNotExist=true -->
<property name="hibernate.connection.username">postgres</property><!-- postgres -->
<property name="hibernate.connection.password">postgres</property><!-- postgres -->
<property name="show_sql">true</property>
<property name="hibernate.current_session_context_class">thread</property>
<mapping class="stack.filter.Check"/>
</session-factory>
输出:
关于java - Hibernate 在 PostgreSQL 中使用驼峰格式的主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39698973/