2010-06-23 43 views
2

我有以下實體(中省略getter和setter)...甲骨文和Hibernate,DB序列發生器發出

@Entity 
@Table(name = "TBL_PROJECT_RUN") 
public class ProjectRunEntity { 

    @Id 
    @Column(name = "ID") 
    @GeneratedValue(generator = "StakeholdersSequence") 
    @SequenceGenerator(name = "StakeholdersSequence", sequenceName = "STAKEHOLDERS_UPDATE_SEQ", allocationSize = 1) 
    private Integer id; 

    @Column(name = "REPORT_RUN_DATE") 
    private Date systemRunDate; 

    @Column(name = "JIRA_PROJECT_NAME") 
    private String jiraProjectName; 

    @Column(name = "JIRA_PROJECT_DESC") 
    private String jiraProjectDescription; 

    @Column(name = "RUNBY") 
    private String runBy; 

    @Column(name = "HEADER_TEXT") 
    private String headerText; 

    @Column(name = "FOOTER_TEXT") 
    private String footerText; 

    @Column(name = "JIRA_ID") 
    private String jiraId; 

    @Column(name = "TO_EMAIL") 
    private String toEmail; 

    @Column(name = "CC_EMAIL") 
    private String ccEmail; 

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "projectRunEntity") 
    private List<ProjectRunDetailsEntity> projectRunDetailsEntities; 

然後我提交到這樣的數據庫...

final Session session = sessionProvider.get(); 
    session.persist(projectRunEntity); 
    session.flush(); 
    return projectRunEntity.getId(); 

這裏返回的id不是數據庫中的實際id,它是1或2 off。請注意我爲我的項目中的所有表中的所有ID共享一個序列,以便任何給定的實體都具有項目範圍的唯一索引。什麼會導致這樣的id不正確?

+0

*這裏返回的id不是數據庫中實際的id是什麼* - 你的意思是在表中還是'currval'? – 2010-06-23 21:28:54

回答

2

事實證明,在插入我的行對象之前,oracle的web UI會自動創建觸發器,而不是從此序列中插入一個id。這意味着oracle中的發生器總是落後1。爲了解決這個問題,我刪除了觸發器。

+1

很好的答案。或者,您可以修改觸發器,使其不會插入ID(如果已提供)。 – 2010-06-24 01:26:39

1

想到兩種可能性:

你說你有一個共享序列。你是否同時插入其他表格? (可以增加序列)。

是否在數據庫表上有一個觸發器,它將序列值插入id列中?