2010-06-23 38 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列中?