JPA OneToMany Отношения - иностранный ключ не установлен

Я отправляю данные на сервер с постом ajax

  var obj = {
    'sub': 'this is a test.'
    ,'userName': 'dbdyd'
    ,'saveDate': new Date()
    ,'comments': [
       {'comment':'1a', 'saveDate2': new Date(), 'seq2': null}
       ,{'comment':'2b', 'saveDate2': new Date(), 'seq2': null}
    ]
  };


  $.ajax({
    url: '/cp/RestApi/Posts',
    type: 'POST',
    dataType: 'json',
    contentType: 'application/json',
    data: JSON.stringify(obj)
  })
  .done(function() {
    console.log("success");
  })
  .fail(function() {
    console.log("error");
  });

Я встретил ошибку сервера. foreignKey не установлен в таблицу комментариев.

  INFO: Starting Coyote HTTP/1.1 on http-8080
  Posts [seq=null, sub=this is a test., userName=dbdyd, saveDate=Sun Mar 13 09:05:46 KST 2016
, comments=[Comments [seq2=null, comment=2b, saveDate2=Sun Mar 13 09:05:46 KST 2016, posts=null], Comments [seq2=null, comment=1a, saveDate2=Sun Mar 13 09:05:46 KST 2016, posts=null]]]
Hibernate: insert into onnuricp.posts (save_date, sub, user_name) values (?, ?, ?)
Hibernate: insert into onnuricp.comments (comment, seq, save_date2) values (?, ?, ?)
09:05:47.315 [http-8080-1] ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper - Column 'seq' cannot be null
Mar 13, 2016 9:05:47 AM org.apache.catalina.core.StandardWrapperValve invoke

схема базы данных

Create Table: CREATE TABLE `posts` (
  `seq` int(11) NOT NULL AUTO_INCREMENT COMMENT '게시판번호',
  `sub` varchar(255) DEFAULT NULL COMMENT '제목',
  `user_name` varchar(50) DEFAULT NULL COMMENT '작성자',
  `save_date` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '입력일자',
  PRIMARY KEY (`seq`)
) ENGINE=InnoDB AUTO_INCREMENT=84 DEFAULT CHARSET=utf8 COMMENT='게시판'



CREATE TABLE `comments` (
  `seq2` int(11) NOT NULL AUTO_INCREMENT COMMENT '댓글번호',
  `comment` varchar(255) NOT NULL COMMENT '내용',
  `save_date2` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '작성일자',
  `seq` int(11) NOT NULL COMMENT '게시판번호',
  PRIMARY KEY (`seq2`),
  KEY `FK_posts_TO_comments` (`seq`),
  CONSTRAINT `FK_posts_TO_comments` FOREIGN KEY (`seq`) REFERENCES `posts` (`seq`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='댓글'
;

У меня есть некоторые проблемы с весны данных JPA. Кажется, что отношения @OneToMany неправильные, но я не знаю об этом.

@Entity
@Table(name = "posts")
public class Posts {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Basic(optional = false)
  @Column(name = "seq")
  private Integer seq;

  @Column(name = "sub", nullable = true)
  private String sub;

  @Column(name = "user_name")
  private String userName;

  @Column(name = "save_date", nullable = false)
  @Temporal(TemporalType.TIMESTAMP)
  private Date saveDate;

  @OneToMany( mappedBy = "posts", cascade = CascadeType.ALL)
  private Set<Comments> comments;

}



@Entity
@Table(name = "comments")
public class Comments implements Serializable {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Basic(optional = false)
  @Column(name = "seq2")
  private Integer seq2;

  @Column(name = "comment", nullable = false)
  private String comment;

  @Column(name = "save_date2", nullable = false)
  @Temporal(TemporalType.TIMESTAMP)
  private Date saveDate2;

  @ManyToOne(optional = false)
  @JoinColumn(name = "seq", referencedColumnName="seq", nullable = false)
  private Posts posts;

}

сохранить объект (сообщения и комментарии). и сервис реализует, как это.

Posts entity = new Post();
Posts savedEntity = repository.save(entity);

пожалуйста, помогите мне с отношениями JPA.

2 ответа

Ваш @OneToMany отображение выглядит правильно. Но вам не нужно указывать referencedColumnName = "seq" просто используйте

@ManyToOne(optional = false)
@JoinColumn(name = "seq", nullable = false)
private Posts posts;

Не используйте множественное число для Comments а также Posts, Просто Comment, Post,

Вы можете сохранить Comments с помощью Posts

Posts post = new Posts();
post.setComments(new HashSet<Comments>());

Comments comment = new Comments();
comment.setPosts(post);
post.getComments().add(comment);

save(post);

Если у вас уже есть post в базе данных. Вы можете добавить comment этим способом

Comments comment = new Comments();
comment.setPosts(post);

save(comment);

Я решил эту проблему и столкнулся с другими проблемами. Итак, я добавляю какое-то решение в этот пост.

во-первых, я установил, что внешний ключ не установлен в объект комментариев. Я должен добавить метод [addComments (Comments co)] в класс сообщений. если у меня есть массив Comments Object, я должен добавить Object Method, который он реализует, чтобы добавить в коллекцию. Нечего добавлять другие вещи.

@Entity
@Table(name = "posts", catalog = "onnuricp")
public class Posts {

  @OneToMany( mappedBy = "posts", cascade = CascadeType.ALL)
  private Set<Comments> comments;

  public Posts() {
    comments = new HashSet<Comments>();
  }

  public void addComments(Comments co) {
    co.setPosts(this);
    comments.add(co);
  }

}

Во-вторых, я столкнулся с проблемой ошибки привязки данных Джексона. добавить код, чтобы исправить это.

@JsonIdentityInfo(
  generator = ObjectIdGenerators.PropertyGenerator.class, property = "seq2")

public class CommentsDto implements Serializable {

  getter .. ;
  setter .. ;

}


@JsonIdentityInfo(
  generator = ObjectIdGenerators.PropertyGenerator.class, property = "seq")

public class PostsDto implements Serializable {

  getter .. ;
  setter .. ;
}
Другие вопросы по тегам