2

これは私の学生エンティティです、

@Entity
@Access(AccessType.FIELD)
@Table(name="TBL_STUDENT")
public class Student  implements  Serializable{
  .....
  .....
  ....
  ..
  .
  @OneToOne(  targetEntity=StudentContact.class,
              fetch=FetchType.LAZY,
              cascade={CascadeType.ALL}
           )
  @JoinColumn(name="CONTACT_ID")
  private StudentContact contact;
  .....
  ...
  ..
}

これは私のStudentContactエンティティです。

@Entity
@Table(name="TBL_STD_CONTACT")
public class StudentContact implements Serializable{
   ......
   ....
   ..
   @OneToOne(  mappedBy="contact",
               targetEntity=Student.class,
               cascade={
                         CascadeType.PERSIST,
                         CascadeType.MERGE
                       }
               fetch= FetchType.LAZY)
   private Student student;
   ........
   ......
   ....
   ..
   .
}

私のStudentTest.javaには、私がやろうとしているmainメソッドが含まれています。

tx = em.getTransaction();   
tx.begin();  
StudentContact contact = em.find(StudentContact.class,38);
em.remove(contact);  
tx.commit(); 

上記の操作では、StudentContactエンティティは削除されません。ログを確認すると、StudentContactとStudentのSelectクエリが表示されますが、Deleteクエリは出力されず、例外も表示されません。

どこが間違っているのですか?

4

1 に答える 1

3

StudentからStudentContactへの参照整合性制約(外部キー)がおそらく存在します。したがって、学生は存在しないエンティティを指すため、StudentContactを削除することはできません。

最初に、次のようなこの参照を削除する必要があります。

tx = em.getTransaction();   
tx.begin();  
StudentContact contact = em.find(StudentContact.class,38);
Student student = contact.getStudent();
student.setContact(null);
contact.setStudent(null);
em.merge(student);
em.remove(em.merge(contact));
tx.commit(); 
于 2013-03-05T10:06:19.247 に答える