Ant*_*sev 9 java mysql spring hibernate maven
我有继承映射的一些问题.这是我的数据库结构:

和相关实体:
@MappedSuperclass
public abstract class AbstractEntity<ID extends Serializable> implements Serializable {
@Id @GeneratedValue(strategy = IDENTITY)
@Column(unique = true, updatable = false, nullable = false)
private ID id;
public ID getId() {
return id;
}
@SuppressWarnings("unused")
public void setId(ID id) {
this.id = id;
}
Run Code Online (Sandbox Code Playgroud)
@Entity @Table(name = "user_activity")
@Inheritance(strategy = JOINED)
@AttributeOverride(name = "id", column = @Column(name = "ua_id"))
public abstract class UserActivity extends AbstractEntity<Long> {
@ManyToOne(cascade = { MERGE, PERSIST }, fetch = LAZY)
@JoinColumn(name = "ua_user_id")
private User user;
...
}
Run Code Online (Sandbox Code Playgroud)
@Entity @Table(name = "comment")
@PrimaryKeyJoinColumn(name = "cm_id")
public class Comment extends UserActivity {
@ManyToOne(cascade = { MERGE, PERSIST }, fetch = LAZY)
@JoinColumn(name = "cm_question_id")
private Question question;
...
}
Run Code Online (Sandbox Code Playgroud)
@Entity @Table(name = "question")
@PrimaryKeyJoinColumn(name = "qs_id")
public class Question extends UserActivity {
...
@OneToMany(fetch = LAZY, cascade = ALL, mappedBy = "question")
private List<Answer> answers = new ArrayList<>();
@OneToMany(fetch = LAZY, cascade = ALL, mappedBy = "question")
private List<Comment> comments = new ArrayList<>();
...
}
Run Code Online (Sandbox Code Playgroud)
@Entity @Table(name = "answer")
@PrimaryKeyJoinColumn(name = "asw_id")
public class Answer extends UserActivity {
@ManyToOne(cascade = { MERGE, PERSIST }, fetch = LAZY)
@JoinColumn(name = "asw_question_id")
private Question question;
...
}
Run Code Online (Sandbox Code Playgroud)
@Entity @Table(name = "user")
@AttributeOverride(name = "id", column = @Column(name = "user_id"))
public class User extends AbstractEntity<Long> {
...
@OneToMany(cascade = REMOVE)
private List<Question> questions = new ArrayList<>();
@OneToMany(cascade = REMOVE)
private List<Answer> answers = new ArrayList<>();
@OneToMany(cascade = REMOVE)
private List<Comment> comments = new ArrayList<>();
...
}
Run Code Online (Sandbox Code Playgroud)
当我尝试保存或删除时,User我得到一个例外:
org.springframework.dao.InvalidDataAccessResourceUsageException: could not prepare statement; SQL [insert into user_question (user_user_id, questions_qs_id) values (?, ?)]; nested exception is org.hibernate.exception.SQLGrammarException: could not prepare statement
Run Code Online (Sandbox Code Playgroud)
和:
org.hibernate.engine.jdbc.spi.SqlExceptionHelper : 147 = user lacks privilege or object not found: USER_ANSWER
Run Code Online (Sandbox Code Playgroud)
Hibernate是试图建立一个表:user_question与user_answer这我不需要.
我应该做些什么修复?
我认为您无法通过将ManyToOne关联映射到实体User中的一般方式来实现此目的UserActivity。对于 JPA 提供者(Hibernate)来说这可能太令人困惑了。
相反,我认为您需要将关联映射到每个,和实体User中。是的,我知道这会是重复的代码,但它看起来是您能够在使用引用时限定映射的唯一方法。QuestionAnswerCommentOneToManyUsermappedBy
例如,您的Question实体将具有定义为的关联:
@ManyToOne(cascade = { MERGE, PERSIST }, fetch = LAZY)
@JoinColumn(name = "ua_user_id")
private User questionUser;
Run Code Online (Sandbox Code Playgroud)
根据 Hibernate 对上述关联的巧妙程度(或不巧妙程度),您可能需要table="USER_ACTIVITY"在JoinColumn注释中指定 。
那么UserOneToMany 将为:
@OneToMany(mappedBy="questionUser", cascade = REMOVE)
private List<Question> questions = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)
对于每个Answer和也是如此Comment。
当然,我没有尝试过,所以我可能是错的。