Spring JPA 休眠重复

Spring JPA Hibernate duplicate

嗨,我是这个世界的新手。 我正在使用 spring jpa hibernate 创建自己的应用程序。 我有一个实体 class。它通常有效,但它会重复属性。 我的代码如下所示:

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.validation.constraints.NotNull;

    @Entity
    public class Event {

        @Id
        @GeneratedValue
        private Integer id;

        public Integer getId() {
            return id;
        }

        @Column(nullable = false)
        public void setId(Integer id) {
            this.id = id;
        }

        /*------------------------------ title ------------------------*/
        private String title;
        @Column(nullable = false)
        public String getTitle() {
            return title;
        }

        @Column(nullable = false)
        public void setTitle(String title) {
            this.title = title;
        }

        /* [Note] I have two extra ids : event_id, eventId 
        - so these are not the case of the duplication. */
        /*------------------- event_id -----------------------------*/
        private String event_id;

        public String getEvent_id() {
            return event_id;
        }

        public void setEvent_id(String event_id) {
            this.event_id = event_id;
        }

    /*-------------- eventId -------------------------------------*/
        @Column(unique = true)
        private String eventId;

        public String getEventId() {
            return eventId;
        }

        public void setEventId(String eventId) {
            this.eventId = eventId;
        }



        /*------------------------------ publishedDate ------------------------------------------*/
        private String publishedDate;   

        public String getPublishedDate() {
            return publishedDate;
        }

        @Column(nullable = false)
        public void setPublishedDate(String publishedDate) {
            this.publishedDate = publishedDate;
        }


        /*--------------------------------- endTime -----------------------------------*/
        private String endTime;         
        public String getEndTime() {
            return endTime;
        }
        @Column(nullable = false)
        public void setEndTime(String endTime) {
            this.endTime = endTime;
        }

        /*-------------------------------- user ------------------------------------------*/
        @ManyToOne
        @JoinColumn(name="user_id")   
        private User user;
        public User getUser() {
            return user;
        }
        @Column(nullable = false)
        public void setUser(User user) {
            this.user = user;

    }

然后当我检查JPA图时,它有几个属性重复。 我添加了我的 JPA 图图像(红色部分是重复的)

这是我使用 java 编程的第一个应用程序。 所以请理解,即使我阅读了 spring jpa 的文档, 很难弄清楚我在代码中到底做错了什么。 有任何想法吗?提前致谢。

问题是 JPA 需要字段级注释或访问器 (getters/setters) 注释。但是,您同时使用两者,这基本上是不允许的。从访问器中删除所有他的注释,只将它们放在字段上。

关于 Java 编程(样式)的小提示将您的字段放在 类 之上而不是访问器之间。

@Entity
public class Event {

    @Id
    @GeneratedValue
    private Integer id;

    @Column(unique = true)
    private String eventId;

    private String event_id;

    @Column(nullable = false)
    private String title;

    @Column(nullable = false)
    private String publishedDate;   

    @Column(nullable = false)
    private String endTime;         

    @ManyToOne
    @JoinColumn(name="user_id")   
    @Column(nullable = false)
    private User user;

    // Getters / Setters omitted

}

去掉accessors的注解,你真的要设置id吗?我希望不会,所以您可能想要删除 setId 方法。

如评论中所述,您的问题是您对同一个属性使用了两个注释,首先在字段中,然后在其 getter/setter 中,因此您只能使用其中一个,例如:

    @Id
    @GeneratedValue
    private Integer id;

    public Integer getId() {
        return id;
    }

    @Column(nullable = false)
    public void setId(Integer id) {
        this.id = id;
    }

应该是:

    @Id
    @GeneratedValue
    private Integer id;

    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }

这里使用 getter 和 setter 的注释是错误的:

    @Column(nullable = false)
    public String getTitle() {
        return title;
    }

    @Column(nullable = false)
    public void setTitle(String title) {
        this.title = title;
    }

注:

因此,为了避免这种情况,您必须在以下两者之间做出选择:

  • 在字段中使用注释。

  • 并将它们与其 setter 一起使用。

Spring 引导 2.0.0.M5、JPA、Hibernate 5.2。11.Final

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "auto_gen")
@SequenceGenerator(name = "auto_gen", sequenceName = "customer_id_seq", allocationSize=1)
@Column(name = "id")
private Long id;

这是一个工作示例:

package hello;

import org.hibernate.annotations.Type;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

@Entity
@Table(name = "customer")
public class Customer {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "auto_gen")
    @SequenceGenerator(name = "auto_gen", sequenceName = "customer_id_seq", allocationSize = 1)
    @Column(name = "id")
    private Long id;

    @Column(name = "first_name")
    //@Type(type="org.hibernate.type.StringType")
    private String firstName;

    @Column(name = "last_name")
    //@Type(type="org.hibernate.type.StringType")
    private String lastName;

    protected Customer() {

    }

    public Customer(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    @Override
    public String toString() {
        return String.format("Customer[id=%d, firstName='%s', lastName='%s']", id, firstName, lastName);
    }

}