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 .. ;
}