java – @ManyToOne映射不适用于连接继承
发布时间:2020-12-15 02:27:31 所属栏目:Java 来源:网络整理
导读:我有以下数据库结构: CREATE TABLE `author` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`name` varchar(255) NOT NULL,`email` varchar(255) NOT NULL,`password` varchar(255) NOT NULL,PRIMARY KEY (`id`));CREATE TABLE `message` (`id` int(10)
我有以下数据库结构:
CREATE TABLE `author` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT,`name` varchar(255) NOT NULL,`email` varchar(255) NOT NULL,`password` varchar(255) NOT NULL,PRIMARY KEY (`id`)); CREATE TABLE `message` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT,`title` varchar(500) NOT NULL,`text` varchar(50000) NOT NULL,`author_id` int(10) unsigned DEFAULT NULL,`creation_date` datetime NOT NULL,`last_update_date` datetime NOT NULL,PRIMARY KEY (`id`),KEY `author_id_fk` (`author_id`),CONSTRAINT `message_ibfk_1` FOREIGN KEY (`author_id`) REFERENCES `author` (`id`)); CREATE TABLE `comment` ( `id` int(10) unsigned NOT NULL,`post_id` int(10) unsigned NOT NULL,KEY `message_id_fk` (`id`),KEY `post_id_fk` (`post_id`),CONSTRAINT `comment_ibfk_1` FOREIGN KEY (`id`) REFERENCES `message` (`id`),CONSTRAINT `comment_ibfk_2` FOREIGN KEY (`post_id`) REFERENCES `post` (`id`)); CREATE TABLE `post` ( `id` int(10) unsigned NOT NULL,CONSTRAINT `post_ibfk_1` FOREIGN KEY (`id`) REFERENCES `message` (`id`) ON DELETE CASCADE); 以及使用hibernate(3.5.4-Final)的以下映射: @Entity @Table(name = "author") public class Author { private Long id = 0L; private String name; private String email; private String password; private Set<Post> posts; private Set<Comment> comments; @Id @Column(name = "id") @GeneratedValue public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Column(name = "name") public String getName() { return name; } public void setName(String name) { this.name = name; } @Column(name = "email") public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } @Column(name = "password") public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @OneToMany(mappedBy = "author") public Set<Post> getPosts() { return posts; } public void setPosts(Set<Post> posts) { this.posts = posts; } @OneToMany(mappedBy = "author") public Set<Comment> getComments() { return comments; } public void setComments(Set<Comment> comments) { this.comments = comments; } } @MappedSuperclass @Table(name = "message") @Inheritance(strategy = InheritanceType.JOINED) public abstract class Message implements Serializable { private Long id; private String title; private String text; private Author author; private Date creationDate; private Date lastUpdateDate; @Id @Column(name = "id") @GeneratedValue public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Column(name = "title") public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } @Column(name = "text") public String getText() { return text; } public void setText(String text) { this.text = text; } @ManyToOne @JoinColumn(name = "author_id") public Author getAuthor() { return author; } public void setAuthor(Author author) { this.author = author; } @Column(name = "creation_date") public Date getCreationDate() { return creationDate; } public void setCreationDate(Date creationDate) { this.creationDate = creationDate; } @Column(name = "last_update_date") public Date getLastUpdateDate() { return lastUpdateDate; } public void setLastUpdateDate(Date lastUpdateDate) { this.lastUpdateDate = lastUpdateDate; } } @Entity @Table(name = "comment") @PrimaryKeyJoinColumn(name="id") public class Comment extends Message { private static final long serialVersionUID = 1L; private Post post; @ManyToOne @JoinColumn(name = "post_id") public Post getPost() { return post; } public void setPost(Post post) { this.post = post; } } @Entity @Table(name = "post") @PrimaryKeyJoinColumn(name="id") public class Post extends Message { private static final long serialVersionUID = 1L; private Set<Comment> comments; @OneToMany(mappedBy = "post") public Set<Comment> getComments() { return comments; } public void setComments(Set<Comment> comments) { this.comments = comments; } } 主要的想法是Comment和Post都是从Message继承的,我希望它们都具有双向关系.但是当我运行以下代码时: Session session = HibernateUtil.getSessionFactory().getCurrentSession(); Transaction tx = session.beginTransaction(); Author author = new Author(); author.setName("mike"); author.setPassword("123"); author.setEmail("mike@gmail.com"); Post post = new Post(); post.setAuthor(author); post.setCreationDate(new Date()); post.setLastUpdateDate(new Date()); post.setText("Text"); post.setTitle("Title"); Long authorId = (Long)session.save(author); Long postId = (Long)session.save(post); tx.commit(); 我收到以下错误: ERROR JDBCExceptionReporter:101 - Unknown column 'author_id' in 'field list' Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not insert: [org.blogsample.mappingbeans.Post] at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:92) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:64) 更新 解决方法
您的Message类不应使用@MappedSuperclass注释,而应使用@Entity注释. @MappedSuperclass意味着扩展此类的实体从超类继承列和关联,但这些列和关联都在子类的表中. author_id不在注释表或post表中.它在消息表中.
而且@Table只能与实体一起使用.不是映射的超类,它只用于继承字段和关联,但不像实体那样映射到它自己的表. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |