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..

soruldu: 11 Kas '13, 18:09

aheng's gravatar image

aheng
2067815
cevap kabul oranı: 7%

değiştirildi: 11 Kas '13, 18:22

EntityManager'ı init ediyor musun ? Debug seviyesinde silmeden önce EntityManager'ı izlemye almanı öneririm.

(12 Kas '13, 02:48) Tugrul Asik Tugrul%20Asik's gravatar image

init'ten kasıt nedir hocam?

(12 Kas '13, 04:09) aheng aheng's gravatar image

Gerek kalmadı sanırım ;)

(12 Kas '13, 07:26) Tugrul Asik Tugrul%20Asik's gravatar image

galiba :) lakin yine de merak ettim entity manager'ı init etmekten kastını neydi?

(12 Kas '13, 14:17) aheng aheng's gravatar image

Problem "readOnly = true"den kaynaklanıyormuş.

@Repository
@Transactional
public class StudentDAO implements IStudentDAO {

    @PersistenceContext
    EntityManager em;
    ....................

şeklinde düzeltince çözüldü.

permanent link

cevaplandı: 12 Kas '13, 05:08

aheng's gravatar image

aheng
2067815
cevap kabul oranı: 7%

Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×281
×128
×109

Soruldu: 11 Kas '13, 18:09

Görüntüleme: 752 kez

Son güncelleme: 12 Kas '13, 14:17

powered by BitNami OSQA