Я использую JPA (EclipseLink) и Spring. Скажем, у меня есть простая сущность с автоматически сгенерированным идентификатором:
@Entity
public class ABC implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
// ...
}
В моем классе DAO у меня есть метод вставки, который вызывает persist()
эту сущность. Я хочу, чтобы метод возвращал сгенерированный идентификатор для нового объекта, но когда я его тестирую, он возвращается 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);
}
}
Ответы:
Идентификатор гарантированно создается только во время сброса. Сохранение сущности только делает ее «прикрепленной» к контексту сохранения. Итак, либо явным образом очистите диспетчер сущностей:
или вернуть сам объект, а не его идентификатор. Когда транзакция завершится, произойдет сброс, и пользователи сущности вне транзакции увидят сгенерированный идентификатор в сущности.
источник
@GeneratedValue
- что бы это ниinsertABC
создает ли новый объект? Или доработать старую?убедитесь, что в вашем классе сущности присутствует нотация @GeneratedValue. Это сообщает JPA о автоматически сгенерированном поведении вашего свойства сущности.
источник
Вот как я это сделал:
источник
Вы также можете использовать GenerationType.TABLE вместо IDENTITY, которое доступно только после вставки.
источник
Другой вариант, совместимый с 4.0:
Перед фиксацией изменений вы можете восстановить новый
CayenneDataObject
объект (ы) из коллекции, связанной с контекстом, например:затем откройте
ObjectId
для каждого из них в коллекции, например:Наконец, вы можете выполнять итерацию по значениям, где обычно сгенерированный идентификатор будет первым из значений (для одного ключа столбца) в карте, возвращаемой
getIdSnapshot()
, он также содержит имена столбцов, связанных с PK как ключ (ы):источник
Вот как я это сделал. Можешь попробовать
источник
источник
em.flush()
неem.refresh(abc)
.