加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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)

更新
正如@JB Nizet之前提到的,我将@MappedSuperclass改为@Entity,之后我又得到了另一个错误mappedBy引用了一个未知的目标实体属性:org.blogsample.mappingbeans.Comment.author,这是通过改变db结构来解决的(删除了author_id)从消息表中,将其添加到每个注释,发布和创建此列的外键)并将作者(和带有映射的getter / setter)移动到Comment,Post类.

解决方法

您的Message类不应使用@MappedSuperclass注释,而应使用@Entity注释. @MappedSuperclass意味着扩展此类的实体从超类继承列和关联,但这些列和关联都在子类的表中. author_id不在注释表或post表中.它在消息表中.

而且@Table只能与实体一起使用.不是映射的超类,它只用于继承字段和关联,但不像实体那样映射到它自己的表.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读