我有1个表,其中包含来自自动增加ID(每日刷新)的复合主键并传入值。我正在使用Hibernate进行数据库进程。我可以知道如何在保存后立即检索自动增加ID值吗? 我试图获取ID,但自动增加ID只是让我没有价值。
代码:
public class TableA implements Serializable {
private static final long serialVersionUID = 1L;
private TableAPK id;
@Id
@EmbeddedId
public TableAPK getId() {
return this.id;
}
......
}
@Embeddable
public class TableAPK implements Serializable {
/**
*
*/
private static final long serialVersionUID = -335299619303934505L;
private int tableAId;
private String value;
public TableAPK() {
}
@GeneratedValue(strategy = GenerationType.AUTO)
public int getTableAId() {
return this.tableAId;
}
...........
}
public Object persist(Session session, TableA entity) throws SystemException {
Object id = null;
try {
id = session.save(entity);
......
return id;
}
public void save(TableA entity) throws SystemException {
Transaction trns = null;
Session session = null;
try {
session = SessionUtil.getSessionFactory().openSession();
trns = session.beginTransaction();
DaoInterface<TableA> dao = new TableADaoImpl();
dao.persist(session, entity);
trns.commit();
if (logger.isLoggable(Level.INFO)) {
logger.info("Create New: ID: " + entity.getId().getTransId()
+ ", Created time: " + entity.getId().getValue());
}
...............
}
我尝试在保存后获取ID值,如下所示 TableAPK id = dao.persist(session,entity); 或者在保存后添加刷新和刷新
dao.persist(session, entity);
session.flush;
session.refresh(entity)
但我仍然无法检索tableAId值。
希望有人能给我一些建议。
答案 0 :(得分:1)
您使用哪种Hibernate方法来坚持实体保存()或坚持()? 如果您使用的是persist(),则 persist()将永远不会将任何值返回给客户端,因此请尝试此操作,
long id = session.save(entity);
如果这是您用来保存实体的方法
public Long persist(Session session, TableA entity) throws SystemException {
Long id = null;
try {
id = session.save(entity);
......
return id;
}
表单,您调用此方法public void save(TableA entity)
试试这个,
TableAPK tableAPK=new TableAPK();
tableAPK.setTableAId(....);
tableAPK.setValue(....);
TableA tableA=new TableA();
tableA.setId(tableAPK);
Object compositeId=session.save(tableA);
我一直徘徊在万维网上的所有可能的链接上,并试图找到为什么你不能将@GeneratedValue与@EmbeddedId或@IdClass(即复合PK)一起使用。原因是你不能。
复合PK基于ASSIGNMENT而不是基于GENERATION。因此,任何@GeneratedValue内容都不适用于它们。我的项目也有问题,我认为没有其他方法
如果您知道您的@GeneratedValue ID在您的域(例如,您的数据库)的上下文中始终是唯一的,则您不需要使用复合PK并进行一些内部检查以确定记录的唯一性< / p>