2014-11-05 86 views
2

我有一个Java Server Faces项目使用Hibernate将数据存储到PostgreSQL数据库。休眠不使用PostgreSQL序列来生成主键

我遇到的问题是,Hibernate不考虑现有序列(fifo_id_seq),同时将数据保存到数据库中;它保存着id = 0;

答案可能非常明显,因为我是Hibernate的新手。

对于大量的代码,我很抱歉,但我想发布一切可能相关的内容。

FIFO表:

        Table "public.fifo" 
     Column  |  Type  |      Modifiers      
---------------------+------------------+--------------------------------------------------- 
id     | integer   | not null default nextval('fifo_id_seq'::regclass) 
number_of_processes | integer   | 
total_time   | integer   | 
average_time  | double precision | 
average_wait_time | double precision | 
total_wait_time  | integer   | 
Indexes: 
"fifo_pkey" PRIMARY KEY, btree (id) 

的fifo_id_seq序列:

  Sequence "public.fifo_id_seq" 
    Column  | Type |  Value   
---------------+---------+--------------------- 
sequence_name | name | fifo_id_seq 
last_value | bigint | 1 
start_value | bigint | 1 
increment_by | bigint | 1 
max_value  | bigint | 9223372036854775807 
min_value  | bigint | 1 
cache_value | bigint | 1 
log_cnt  | bigint | 0 
is_cycled  | boolean | f 
is_called  | boolean | f 

FifoEntity.java: *注:构造函数和由我添加@Id注释,产生

休息
@Entity 
@Table(name = "fifo", schema = "public", catalog = "processmanagement") 
public class FifoEntity { 
private int id; 
private Integer numberOfProcesses; 
private Integer totalTime; 
private Double averageTime; 
private Double averageWaitTime; 
private Integer totalWaitTime; 

public FifoEntity() 
{ 
    // empty 
} 

public FifoEntity(int numberOfProcesses, int totalTime, double averageTime, double averageWaitTime, int totalWaitTime) 
{ 
    this.numberOfProcesses = numberOfProcesses; 
    this.totalTime = totalTime; 
    this.averageTime = averageTime; 
    this.averageWaitTime = averageWaitTime; 
    this.totalWaitTime = totalWaitTime; 
} 

@Id 
@SequenceGenerator(name="fifo_pkey", sequenceName="fifo_id_seq", allocationSize = 1) 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="fifo_pkey") 
@Column(name = "id", unique = true, nullable = false) 
public int getId() { 
    return id; 
} 

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

@Basic 
@Column(name = "number_of_processes") 
public Integer getNumberOfProcesses() { 
    return numberOfProcesses; 
} 

public void setNumberOfProcesses(Integer numberOfProcesses) { 
    this.numberOfProcesses = numberOfProcesses; 
} 

@Basic 
@Column(name = "total_time") 
public Integer getTotalTime() { 
    return totalTime; 
} 

public void setTotalTime(Integer totalTime) { 
    this.totalTime = totalTime; 
} 

@Basic 
@Column(name = "average_time") 
public Double getAverageTime() { 
    return averageTime; 
} 

public void setAverageTime(Double averageTime) { 
    this.averageTime = averageTime; 
} 

@Basic 
@Column(name = "average_wait_time") 
public Double getAverageWaitTime() { 
    return averageWaitTime; 
} 

public void setAverageWaitTime(Double averageWaitTime) { 
    this.averageWaitTime = averageWaitTime; 
} 

@Basic 
@Column(name = "total_wait_time") 
public Integer getTotalWaitTime() { 
    return totalWaitTime; 
} 

public void setTotalWaitTime(Integer totalWaitTime) { 
    this.totalWaitTime = totalWaitTime; 
} 

@Override 
public boolean equals(Object o) { 
    if (this == o) return true; 
    if (o == null || getClass() != o.getClass()) return false; 

    FifoEntity that = (FifoEntity) o; 

    if (id != that.id) return false; 
    if (averageTime != null ? !averageTime.equals(that.averageTime) : that.averageTime != null) return false; 
    if (averageWaitTime != null ? !averageWaitTime.equals(that.averageWaitTime) : that.averageWaitTime != null) 
     return false; 
    if (numberOfProcesses != null ? !numberOfProcesses.equals(that.numberOfProcesses) : that.numberOfProcesses != null) 
     return false; 
    if (totalTime != null ? !totalTime.equals(that.totalTime) : that.totalTime != null) return false; 
    if (totalWaitTime != null ? !totalWaitTime.equals(that.totalWaitTime) : that.totalWaitTime != null) 
     return false; 

    return true; 
} 

@Override 
public int hashCode() { 
    int result = id; 
    result = 31 * result + (numberOfProcesses != null ? numberOfProcesses.hashCode() : 0); 
    result = 31 * result + (totalTime != null ? totalTime.hashCode() : 0); 
    result = 31 * result + (averageTime != null ? averageTime.hashCode() : 0); 
    result = 31 * result + (averageWaitTime != null ? averageWaitTime.hashCode() : 0); 
    result = 31 * result + (totalWaitTime != null ? totalWaitTime.hashCode() : 0); 
    return result; 
} 
} 

FifoEntity映射到hbm.xml中: *

<class name="com.processmanagement.hibernate.entities.FifoEntity" table="fifo" schema="public" catalog="processmanagement"> 
    <id name="id" column="id"> 
     <generator class="sequence-identity"> 
      <param name="sequence">fifo_id_seq</param> 
     </generator> 
    </id> 
    <property name="numberOfProcesses" column="number_of_processes"/> 
    <property name="totalTime" column="total_time"/> 
    <property name="averageTime" column="average_time"/> 
    <property name="averageWaitTime" column="average_wait_time"/> 
    <property name="totalWaitTime" column="total_wait_time"/> 
</class> 

这就是我怎样,我尝试使用Hibernate来保存数据到数据库:试图保存一个连续的对象时

FifoEntity fifoEntity = new FifoEntity(processList.size(), totalTime, 
      averageProcessTime, averageWaitTime, totalWaitTime); 

    databaseHelper.saveOutcomeToDatabase(fifoEntity); 
. 
. 
. 
    public void saveOutcomeToDatabase(Object object) 
{ 
//  session.beginTransaction(); 
//  session.save(object); 
//  session.getTransaction().commit(); 
    Transaction transaction = session.beginTransaction(); 
    session.persist(object); 
    transaction.commit(); 
    session.clear(); 
} 

当然,错误:

org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "fifo_pkey" 
    Detail: Key (id)=(0) already exists. 

回答

0

经过几个小时的代码搞乱之后,即使从头开始重新编译这个项目,我也无法让它正常工作。

结束了与使用SQL查询,以将数据保存到数据库,就像这样:

 session.getTransaction().begin(); 
     SQLQuery sqlQuery = session.createSQLQuery("INSERT into public.fifo" + 
       " (number_of_processes, total_time, average_time, average_wait_time, total_wait_time) VALUES " + 
       "(" +((FifoEntity) object).getNumberOfProcesses() + ", " + 
       ((FifoEntity) object).getTotalTime()+ ", " + 
       ((FifoEntity) object).getAverageTime() + ", " + 
       ((FifoEntity) object).getAverageWaitTime() + ", " + 
       ((FifoEntity) object).getTotalWaitTime() + ");"); 
     session.getTransaction().commit(); 

这是一个有点乱,但它的工作原理,给我时间去了解Hibernate的更好,而不放弃项目或大量修改背后的整个想法。

2

为了能够使用序列有关休眠的实体,我们可以使用@SequenceGenerator和@Generated值 例如:

@Id 
@Basic(optional = false) 
@Column(name = "id") 
@SequenceGenerator(name="third_party_seq", sequenceName="third_party_seq",allocationSize=1) 
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="third_party_seq") 
private Long id; 

我使用Hibernate和PostgreSQL。欲了解更多的参考,我们可以从中读到 - http://goo.gl/RQ0Dxg

0

刚才碰到了同样的事情。当在Hibernate中使用Postgres序列时,不要在序列中使用主键列上设置默认值,因为Hibernate想要自己设置序列值。即。从您的表格定义中删除:“default nextval('fifo_id_seq':: regclass)”