jpa 获取多个生成的id_JPA – 在persist()之后返回一个自动生成的id

JPA – 在persist()之后返回一个自动生成的id

我正在使用JPA(EclipseLink)和Spring。 说我有一个自动生成的ID简单的实体:

@Entity public class ABC implements Serializable { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private int id; // ... }

在我的DAO类中,我有一个调用此实体上的persist()的插入方法。 我想要的方法返回为新的实体生成的ID,但是当我testing它,而不是返回0 。

public class ABCDao { @PersistenceContext EntityManager em; @Transactional(readOnly=false) public int insertABC(ABC abc) { em.persist(abc); // I WANT TO RETURN THE AUTO-GENERATED ID OF abc // HOW CAN I DO IT? return abc.id; // ??? } }

我也有一个服务类包装的DAO,如果这有所作为:

public class ABCService { @Resource(name="ABCDao") ABCDao abcDao; public int addNewABC(ABC abc) { return abcDao.insertABC(abc); } }

ID只能保证在冲洗时生成。 坚持一个实体只是使其“附加”到持久化上下文。 所以,要么直接刷新实体pipe理器:

em.persist(abc); em.flush(); return abc.getId();

或返回实体本身而不是其ID。 当事务结束时,刷新将会发生,事务之外的实体的用户将看到实体中生成的ID。

@Override public ABC addNewABC(ABC abc) { abcDao.insertABC(abc); return abc; }

@Entity public class ABC implements Serializable { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private int id; }

请检查您的实体类中是否存在@GeneratedValue注释。这会告诉JPA您的实体属性自动生成的行为

你也可以使用GenerationType.TABLE,而不是IDENTITY,只有在插入后才可用。

这是我做到的:

EntityManager entityManager = getEntityManager(); EntityTransaction transaction = entityManager.getTransaction(); transaction.begin(); entityManager.persist(object); transaction.commit(); long id = object.getId(); entityManager.close();

em.persist(abc); em.refresh(abc); return abc;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值