Saya menggunakan JPA (EclipseLink) dan Spring. Katakanlah saya memiliki entitas sederhana dengan ID yang dibuat secara otomatis:
@Entity
public class ABC implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
// ...
}
Di kelas DAO saya, saya memiliki metode sisipkan yang memanggil persist()
entitas ini. Saya ingin metode mengembalikan ID yang dihasilkan untuk entitas baru, tetapi ketika saya mengujinya, ia mengembalikannya 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; // ???
}
}
Saya juga memiliki kelas layanan yang membungkus DAO, jika itu membuat perbedaan:
public class ABCService {
@Resource(name="ABCDao")
ABCDao abcDao;
public int addNewABC(ABC abc) {
return abcDao.insertABC(abc);
}
}
Jawaban:
ID hanya dijamin akan dibuat pada waktu yang ditentukan. Mempertahankan entitas hanya membuatnya "melekat" pada konteks ketekunan. Jadi, hapus pengelola entitas secara eksplisit:
atau kembalikan entitas itu sendiri, bukan ID-nya. Ketika transaksi berakhir, flush akan terjadi, dan pengguna entitas di luar transaksi akan melihat ID yang dihasilkan di entitas tersebut.
sumber
@GeneratedValue
- apa pun yang diperlukaninsertABC
membuat objek baru? Atau modifikasi yang lama?periksa apakah notasi @GeneratedValue ada di kelas entitas Anda. Ini memberi tahu JPA tentang perilaku yang dibuat secara otomatis pada properti entitas Anda
sumber
Beginilah cara saya melakukannya:
sumber
Anda juga bisa menggunakan GenerationType.TABLE sebagai ganti IDENTITY yang hanya tersedia setelah penyisipan.
sumber
Pilihan lain yang kompatibel dengan 4.0:
Sebelum melakukan perubahan, Anda dapat memulihkan
CayenneDataObject
objek baru dari koleksi yang terkait dengan konteks, seperti ini:lalu akses
ObjectId
untuk masing-masing dalam koleksi, seperti:Akhirnya Anda dapat mengulang di bawah nilai, di mana biasanya id yang dihasilkan akan menjadi yang pertama dari nilai (untuk kunci kolom tunggal) di Peta yang dikembalikan oleh
getIdSnapshot()
, itu berisi juga nama kolom yang terkait dengan PK sebagai kunci:sumber
Beginilah cara saya melakukannya. Anda dapat mencoba
sumber
sumber
em.flush()
bukanlahem.refresh(abc)
.