【发布时间】:2014-03-07 13:57:39
【问题描述】:
我在继承映射方面遇到了一些问题。这是我的数据库结构:
及相关实体:
抽象实体:
@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;
}
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;
...
}
评论实体:
@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;
...
}
问题实体:
@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<>();
...
}
回答实体:
@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;
...
}
和用户实体:
@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<>();
...
}
问题:
当我尝试保存或删除 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
和:
org.hibernate.engine.jdbc.spi.SqlExceptionHelper : 147 = user lacks privilege or object not found: USER_ANSWER
Hibernate 正在尝试创建一个表:user_question 和 user_answer 我不需要。
我应该做些什么来修复?
【问题讨论】:
-
USER_ANSWER 和 USER_QUESTION 不会出现在您的数据库架构或映射中。一定少了一些东西!
-
@Julien 是的,我知道。这是因为我没有添加mappedBy。我无法通过
UserActivity将其添加到user字段。 -
您能否在将
ua_user_id保留在user_activity表中的同时解决此问题? -
@Snekse 嘿。我真的不记得我是怎么做到的。检查full source code in GitHub希望它会帮助你。 在
iss59-jooq分支上调查它,因为在master它从 Hibernate 移到 JOOQ 上
标签: java mysql spring hibernate maven