2016-01-23 4 views
0

Я использую CascadeType.PERSIST с ManyToOneJPA: CascadeType.PERSIST с ManyToOne

@ManyToOne(cascade=CascadeType.PERSIST) 
@JoinColumn(name="Article") 
private Article article; 

Постоянство код как:

Article article = new Article(); 
    article.setAuthor("Article Author"); 
    article.setTitle("Article Title"); 
    Comment comm1 = new Comment(); 
    comm1.setAuthor("Author1"); 
    comm1.setTitle("Title1"); 
    article.addComment(comm1); 
    em.persist(comm1); 
    em.getTransaction().commit(); 

Я ожидал, что использование CascadeType.PERSIST на поле будет сделать поставщик сохраняемости для последовательности SQL-запросов в таком порядке, чтобы родительский (статья здесь) сохранялся сначала, а затем дочерние сущности. Но вместо этого я получаю

Вызванный: org.apache.openjpa.lib.jdbc.ReportingSQLException: Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не удается

Что является правильным способом пойти в этом случае?

Статья:

@Entity 
@NamedQuery(name="Article.findAll", query="SELECT a FROM Article a") 
public class Article implements Serializable { 
private static final long serialVersionUID = 1L; 

@Id 
private int id; 

private String author; 

private String title; 

//bi-directional many-to-one association to Comment 
@OneToMany(mappedBy="article",fetch=FetchType.LAZY,cascade=CascadeType.ALL) 
private List<Comment> comments = new ArrayList<Comment>(); 

public List<Comment> getComments() { 
    return this.comments; 
} 

public void setComments(List<Comment> comments) { 
    this.comments = comments; 
} 

public Comment addComment(Comment comment) { 
    getComments().add(comment); 
    comment.setArticle(this); 

    return comment; 
} 

........ 

Комментарий:

@Entity 
@NamedQuery(name="Comment.findAll", query="SELECT c FROM Comment c") 
public class Comment implements Serializable { 
private static final long serialVersionUID = 1L; 

@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
private int id; 

private String author; 

private String title; 

//bi-directional many-to-one association to Article 
@ManyToOne(cascade=CascadeType.PERSIST) 
@JoinColumn(name="Article") 
private Article article; 

...... 

После отлично работает:

em.getTransaction().begin(); 
    Article article = new Article(); 
    article.setAuthor("Article Author"); 
    article.setTitle("Article Title"); 
    em.persist(article); 
+0

Как создается идентификатор статьи? На нем нет '@ GeneratedValue', и вы не указали его в фрагменте кода« Устойчивость ». Вы опустили его? В противном случае это проблема. –

+0

Если я просто сохраняю статью без явного указания идентификатора (код добавлен в исходный пост), он отлично работает ... поэтому я думаю, что генерация id здесь не проблема. – Mandroid

ответ

0

На самом деле, порядок, в котором сохранились сущности, определяет порядок, в котором insert ведомостях генерируется, поэтому все ведет себя как задокументировано. См. Также this answer.

Comment сохраняется сначала (вы явно сохраняете его сначала), то Article будет сохраняться каскадом.

Правильный подход заключается в том, чтобы перенести Article, как вы уже указывали.

+0

Постоянная точка заказа дает понять. Спасибо. – Mandroid

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