One problem I noticed is related to how you initialized the children collection.
You don't declare a null collection association:
private List<Post> posts;
But you do it like this:
private List<Post> posts = new ArrayList();
Then the addPost becomes:
public void addPost(Post post) {
post.setPerson(this);
posts.add(post);
}
Hibernate will always replace the posts ArrayList with a proxy and this way you are sure you want get NullPointerException when accessing the getPosts() without a call to addPost().
Also the Post is the child entity, since it requires a Person first. You don't usually cascade from children to parents, so in the Post entity you can remove the cascade to Parent:
@ManyToOne
public Person getPerson() {
return person;
}
And it's not a good idea to rely on the id in equals and hashCode because of this.
Calling merge and having cascade in Parent should propagate the change to the database. since the bidirectional associations are set by addPost.
Are your service method marked with @Transactional?