2009-07-03 3 views
2

У меня есть эти классы.Удалить связь один к одному

@Entity 
@Table(name ="a") 
class A{ 
    private Integer aId; 
    private B b; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "id_a") 
    public Integer getAId() { 
return aId; 
    } 

    @OneToOne(mappedBy = "a", cascade={CascadeType.ALL}) 
    public B getB() { 
     return b; 
    } 
} 

@Entity 
@Table (name= "b") 
class B{ 
    private A a; 

    @OneToOne 
    @JoinColumn(name = "id_a") 
    public A getA() { 
     return a; 
    } 

} 

И таблицы выглядеть следующим образом:

A) | id_A | .... другие поля ... |

B) | id_B | fk_id_A | ..другие поля .. |

Но, когда я пытаюсь удалить экземпляр, я получаю,

org.hibernate.ObjectDeletedException: удаленный объект будет вновь спасен каскада: (удалить удаленный объект от ассоциаций) [B # 130]

Я попытался установить нуль на перекрестных ссылках:

b.setA(null) 
a.setB(null) 

Но исключение все равно бросается.

Все, что я выполнил, это удалить строку в A и оставить значение внешнего ключа B, но когда я попытаюсь удалить B, получите ту же ошибку.

Это мой код удаления:

public static void delete(Object object) throws Exception { 
     Transaction tx = getSession().beginTransaction();  
     try { 
      getSession().delete(object); 
      tx.commit(); 
     } catch (Exception ex) { 
      tx.rollback(); 
      getSession().close(); 
      throw ex; 
     } 
    } 

getSession всегда возвращает действительный сеанс.

Есть ли что-нибудь, что мне не хватает?

ответ

1

Начинайте сверху и продолжайте работать. Вам нужно удалить ссылку на A в таблице B. Поэтому найдите ссылку в B записи, которую вы пытаетесь удалить в A, и удалите эту запись в B. Затем вернитесь к A и удалите запись в A.

Если вы используете SQL Server, вы можете установить каскадное удаление в таблице A, и это будет сделано для вас автоматически. Вы должны быть осторожны с этим, хотя. Я бы не рекомендовал это для сложных структур.

0

Выполняете ли вы отмену перекрестных ссылок в отдельной транзакции? Возможно, эти изменения потребуются для удаления.

 Смежные вопросы

  • Нет связанных вопросов^_^