Hibernate - ManyToOne&Inheritance/JOINED/mappedBy

Ant*_*sev 9 java mysql spring hibernate maven

我有继承映射的一些问题.这是我的数据库结构:

在此输入图像描述

和相关实体:

AbstractEntity:

@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)

UserAcitvity实体:

@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_questionuser_answer这我不需要.

我应该做些什么修复?

Dun*_*ear 4

我认为您无法通过将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

当然,我没有尝试过,所以我可能是错的。