Trong môi trường đa luồng,
cái này hoạt động
Hộp hộp = Hộp mới("B");
Đồ chơi t1 = box.addNewToy("t1");
Đồ chơi t2 = box.addNewToy("t2");
được đồng bộ hóa (em) {
em.getTransaction().begin();
em.persist(t1);
em.getTransaction().commit();
}
được đồng bộ hóa (em) {
em.getTransaction().begin();
em.persist(t2);
em.getTransaction().commit();
}
nhưng đây không phải là
Hộp hộp = Hộp mới("B");
Đồ chơi t1 = box.addNewToy("t1");
được đồng bộ hóa (em) {
em.getTransaction().begin();
em.persist(t1);
em.getTransaction().commit();
}
Đồ chơi t2 = box.addNewToy("t2");
được đồng bộ hóa (em) {
em.getTransaction().begin();
em.persist(t2);
em.getTransaction().commit();
}
Tôi gặp các lỗi sau: "Đối tượng tham chiếu một phiên bản tạm thời chưa được lưu", "Một đối tượng khác có cùng giá trị nhận dạng đã được liên kết với phiên"
Có ý tưởng gì không?
Đây là một dự án Maven tối thiểu tái tạo vấn đề:http://www.2shared.com/file/bGLmJ6aO/example.html
Chi tiết
phiên bản java "1.7.0_17", ngủ đông 4.2.3.Final, Ubuntu 11.04 natty, SQLite
lớp đồ chơi {
@ManyToMany(mappedBy="toys",fetch = FetchType.LAZY, CascadeType.ALL)
Danh sách công khai getBoxes() { hộp trả lại }
public void setBoxes(List hộp) { this.boxes = hộp }
}
Hộp lớp {
@ManyToMany(tìm nạp = FetchType.LAZY, tầng = CascadeType.ALL)
public List getToys() { trả lại đồ chơi }
public void setToys(List Toys) { this.toys = đồ chơi }
public Toy addNewToy(Tên chuỗi) {
Đồ chơi đồ chơi = Đồ chơi mới();
đồ chơi.setName(tên);
đồ chơi.boxes.add (cái này);
đồ chơi.add(đồ chơi);
trả lại đồ chơi;
}
}
EntityManagerFactory là một đối tượng an toàn luồng, có chi phí tạo cao và được chia sẻ bởi tất cả các luồng ứng dụng. Nó được tạo một lần, thường là khi khởi động ứng dụng.
EntityManager là một giải pháp rẻ tiền, không an toàn theo chủ đề đối tượng nên được sử dụng một lần, cho một quy trình kinh doanh, một đơn vị công việc và sau đó bị loại bỏ ...
参见:http://docs.jboss.org/hibernate/entitymanager/3.6/reference/en/html_single/#transactions-basics
Tôi không chắc chắn bạn đang làm gì, nhưng nếu bạn đang sử dụng cùng một Trình quản lý thực thể tĩnh từ nhiều luồng thì đây là vấn đề của bạn.
EntityManagerFactory là một đối tượng an toàn theo luồng mà bạn muốn chia sẻ, nhưng bạn nên tạo một EntityManager mới cho mỗi yêu cầu/đơn vị công việc đang được thực thi.
Tôi là một lập trình viên xuất sắc, rất giỏi!