【发布时间】:2015-10-30 16:16:07
【问题描述】:
从 oracle 触发序列中自动生成 id 的实体。
@Entity
@Table(name = "REPORT", schema = "WEBPORTAL")
public class Report {
private Integer id;
....
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="report_sequence")
@SequenceGenerator(name="report_sequence", sequenceName = "report_id_seq")
@Column(name="REPORT_ID", unique = true, nullable = false)
public Integer getId() {
return id;
}
....
}
服务
@Service("reportService")
public class ReportServiceImpl implements ReportService {
....
@Transactional(readOnly=false)
public void saveOrUpdate(Report report) {
reportDAO.saveOrUpdate(report);
}
}
道
@Repository
public class ReportDAOImpl implements ReportDAO {
....
@Override
public Report save(Report report) {
try {
Session session = sessionFactory.getCurrentSession();
session.save(report);
} catch (Exception e) {
logger.error("error", e);
}
return report;
}
}
当我调用服务的 saveOrUpdate 然后尝试访问实体的 id 时,我得到的值与数据库中的持久值不同。 自动生成数据库上的值一切正常。有什么建议吗?
reportService.saveOrUpdate(report);
System.out.println(report.getId());
打印:4150 但在数据库中保存的 id 是:84
注意:我获得 Id 的目的来自于我想通过级联来拯救孩子。但是数据库中子项的外键不同(我使用 getId() 获得的 id 值)。
并且数据库中生成的Id加2。EX: 80, 82, 84.
更新:
用于序列生成的 Oracle 触发器
CREATE OR REPLACE TRIGGER REPORT_ID_TRIG
BEFORE INSERT ON WEBPORTAL.REPORT
FOR EACH ROW
BEGIN
SELECT report_id_seq.NEXTVAL
INTO :new.report_id
FROM dual;
END;
【问题讨论】: