Merhaba, JSF-hibernate-spring üzerinde çalışıyorum. Veritabanından kayıt silme ile ilgili aşağıdaki gibi problemim var..
Student.java
@Entity(name = "STUDENTS")
@NamedQueries({
@NamedQuery(name = "getAllStudent", query = "SELECT k FROM STUDENTS k ORDER BY k.id DESC"),
@NamedQuery(name = "findByName", query = "SELECT k FROM STUDENTS k WHERE k.name LIKE :name")
})
public class Student {
@Column(name = "STUDENTNO", nullable = false)
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name = "NAME", nullable = false)
private String name;
@Column(name = "SURNAME")
private String surname;
@Column(name = "AGE")
private String age;
// GET ve SET metodları
StudentDAO.java
@Repository
@Transactional(readOnly = true)
public class StudentDAO implements IStudentDAO {
@PersistenceContext
EntityManager em;
@Override
public void deleteStudent(Student student) {
Student silinecek = em.getReference(Student.class, student.getId());
em.remove(silinecek);
System.out.println("### studentDAO deleteStudent metodunda çıkıldı ###");
StudentController.java
@Component
@Scope(value = "request")
public class StudentController {
@Autowired
IStudentDAO studentDAO;
List<Student> allStudentList = new ArrayList();
Student student = new Student();
@PostConstruct
private void loadStudents() {
allStudentList = studentDAO.allStudent();
public void deleteStudent() {
studentDAO.deleteStudent(student);
System.out.println("### StudentController deleteStudent metodundan çıkılıyor ### ");
}
index.xhtml
<h:form>
<p:outputLabel value="silinecek öğrenci id"/>
<p:inputText value="#{studentController.student.id}"/>
<p:commandButton value="Kaydı Sil" action="#{studentController.deleteStudent()}" />
</h:form>
bu kodlara göre çalıştırdığım zaman studentDAO'dan "### StudentController deleteStudent metodundan çıkılıyor ###" çıktısı alıyorum. Ancak kayıt silinmiyor.
Başta studentDAO;
@Override
public void deleteStudent(Student student) {
em.remove(student);
System.out.println("### studentDAO deleteStudent metodunda çıkıldı ###");
şeklindeydi bu haldeyken: "java.lang.IllegalArgumentException: Removing a detached instance" hatası alıyordum. Biraz baktım bu hata için; "her dao metodu farklı bir entity maneger session açar" gibi bir bildirim gördüm.
@Override
public void deleteStudent(Student student) {
Student silinecek = em.getReference(Student.class, student.getId());
em.remove(silinecek);
şeklinde yazılması gerektiği söyleniyordu. Bu şekilde ise kayıt silinmiyor. Halbuki deleteStudent metodundan çıkılıyor.
Transaction ile ilgili gözden kaçırdığım ya da bilmediğim bir şey olabilir diye düşünüyorum. Bu konudaki önerileriniz nelerdir ?
Bir de findStudent() ve updateStudent() metodu için nasıl bir yol izlemeliyim?
Teşekkürler..