2016-05-18 2 views
1

Это моя база данных:org.hibernate.exception.ConstraintViolationException при использовании @JoinTable

------------  ----------------------  ------------ 
| NEWS |  |  NEWS_IMAGE  |  | IMAGE | 
------------  ----------------------  ------------ 
| id | text|  | id_news | id_image |  | id | URL | 
------------  ----------------------  ------------ 
    |      |  |    | 
    <-<-<-<-<-<- Foreign Key  Foreign Key ->->-> 

В объекте Новости У меня есть List от объекта Image. Вот мое отображение система:

@Entity 
@Table(name = "news") 
class News{ 

    @Id 
    @GeneratedValue 
    @Column(name = "id") 
    private long id; 

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true) 
    @JoinTable(name = "news_image", 
       joinColumns = { @JoinColumn(name = "id_news")}, 
       inverseJoinColumns = { @JoinColumn(name = "id_image")}) 
       private List<Image> images = new ArrayList<Image>();} 

И это объект Image:

@Entity 
@Table(name = "image") 
public class Image { 

    @Id 
    @Column(name = "id") 
    @GeneratedValue 
    private long id; 

    @Column(name = "URL") 
    private String URL; 
} 

Это способ, которым я удалить объект изображения:

News news = org.hibernate.SessionFactory.get(News.class, id); 
Image image = news.getImages().get(0); 
org.hibernate.SessionFactory.getCurrentSessionFactory().delete(image); 

Когда я пытаюсь удалить изображение из таблицы image Я получаю эту ошибку:

Could not execute JDBC batch update; 
SQL [delete from image where id=?]; 
constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: 
Could not execute JDBC batch update. 

Если удалить внешний ключ из таблицы news_image к столу изображение, все работает отлично; Hibernate может удалить первую запись внутри таблицы news_image, а затем запись внутри таблицы image. Что мне делать? Должен ли я удалить этот внешний ключ? Я сделал ошибку при сопоставлении, и именно поэтому я получаю эту ошибку?

Благодарим заранее.

+0

У вас есть проблема с удалением изображения, но при этом вы не можете отправить код для объекта Image или код, который вы хотите удалить, чтобы удалить ??? –

+0

Извините, человек. Я добавил код об объекте Image и способ его удаления. – MDP

ответ

1

Как стой отображения, Image ничего об ассоциации с News поэтому соответствующая запись в таблице NEWS_IMAGE ассоциации никогда не будет удалена Hibernate, как он ничего не знает об этом не знает.

Чтобы исправить это, вы можете либо обновить свой код, как показано ниже:

//News is managing the association to Image and has Cascade options defined 
//so we need to update and merge the News instance 
News news = org.hibernate.SessionFactory.get(News.class, id); 
Image image = news.getImages().get(0); 
news.getImages().remove(image); 
org.hibernate.SessionFactory.getCurrentSessionFactory().saveOrUpdate(news); 

Или вы можете обновить отображения так, что изображение знает об ассоциации и продолжайте как прежде:

Новости:

@Entity 
@Table(name = "news") 
class News{ 

    @Id 
    @GeneratedValue 
    @Column(name = "id") 
    private long id; 

    @OneToMany(mappedBy = "news", cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true) 
    private List<Image> images = new ArrayList<Image>(); 
} 

изображение:

@Entity 
@Table(name = "image") 
public class Image { 

    @Id 
    @Column(name = "id") 
    @GeneratedValue 
    private long id; 

    @Column(name = "URL") 
    private String URL; 

    @ManyToOne(cascade = CascadeType.DELETE) 
    @JoinTable(name = "news_image", 
       joinColumns = { @JoinColumn(name = "id_image")}, 
       inverseJoinColumns = { @JoinColumn(name = "id_news")}) 
    private News news; 

} 
+0

Спасибо, человек. Пока вы отвечали, я редактировал свой пост, добавляя систему mappinmg внутри Image (точно так же, как вы писали), но я оставил старую систему отображения внутри News; он работает. Но я не могу понять, есть ли @JoinTable в обеих новостях.класс и Image.class могут привести меня к некоторым проблемам в будущем. В любом случае, спасибо за решение, отлично, как и все, что вы мне дали в прошлом: D – MDP

+0

Нет, вы используете mappedBy с другой стороны. –

0

Сначала необходимо удалить из таблицы соединений, а затем удалить из дочерней таблицы.

delete pc.* from parent_child as pc left join child as c on pc.id_child=c.id where c.id = 1; 
delete from child where child.id = 1; 
+0

Действительно? Почему нет нормальной каскадной операции? –

+0

Я не пытался это делать в JPQL, потому что плакат, похоже, использует SQL. –

+0

На самом деле мне нужно использовать Cascade Operation. Я добавил код – MDP

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