Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 字段创建时出现重复映射异常_Java_Mysql_Hibernate_Spring Boot_Spring Data Jpa - Fatal编程技术网

Java 字段创建时出现重复映射异常

Java 字段创建时出现重复映射异常,java,mysql,hibernate,spring-boot,spring-data-jpa,Java,Mysql,Hibernate,Spring Boot,Spring Data Jpa,我有两个表employee和employee\u document。下面是两个表的mysql查询- CREATE TABLE employee ( id int(11) unsigned NOT NULL, name varchar(100) COLLATE utf8_unicode_ci NOT NULL, email varchar(50) COLLATE utf8_unicode_ci NOT NULL, password_hash varchar(100) COLLATE

我有两个表
employee
employee\u document
。下面是两个表的mysql查询-

CREATE TABLE employee (
  id int(11) unsigned NOT NULL,
  name varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  email varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  password_hash varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  status int(11) NOT NULL,
  creation_date bigint(20) NOT NULL,
  created_by int(11) DEFAULT NULL,
  update_date bigint(20) NOT NULL,
  updated_by int(11) DEFAULT NULL,
  PRIMARY KEY (id),
  UNIQUE KEY email (email)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE employee_document (
  id int(11) unsigned NOT NULL AUTO_INCREMENT,
  employee_id int(11) unsigned NOT NULL,
  file_id int(11) unsigned NOT NULL,
  document_type varchar(50) COLLATE utf8_unicode_ci DEFAULT '',
  status int(11) DEFAULT NULL,
  creation_date bigint(20) DEFAULT NULL,
  created_by int(11) unsigned NOT NULL,
  update_date bigint(20) DEFAULT NULL,
  updated_by int(11) unsigned NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
在我的SpringBoot项目中,我使用hibernate和JPA数据。下面是这些表的java解释

@MappedSuperclass
public abstract class AbstractTimestampEntity {

    @Transient
    Logger log = LoggerFactory.getLogger(AbstractTimestampEntity.class);

    @Column(name = "creation_date", nullable = false, updatable=false)
    private Long creationDate;

    @Column(name = "update_date", nullable = false)
    private Long updateDate;

    @PrePersist
    protected void onCreate() {
        log.debug("onCreate");
        updateDate = creationDate = System.currentTimeMillis();
    }

    @PreUpdate
    protected void onUpdate() {
        log.debug("onUpdate");
        updateDate = System.currentTimeMillis();
    }
}

@Entity
@Table(name = "employee")
public class Employee extends AbstractTimestampEntity implements Serializable {
    private static final long serialVersionUID = 1L;

    public static final Integer STATUS_INACTIVE = 0;
    public static final Integer STATUS_ACTIVE = 1;
    public static final Integer STATUS_ARCHIVED = -1;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    public Integer id;

    @Column(name = "name", nullable = false)
    public String name;

    @Email
    @Column(name = "email", nullable = false, unique = true)
    public String email;

    @JsonIgnore
    @Column(name = "password_hash", nullable = false)
    public String passwordHash;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "employee", fetch = FetchType.EAGER)
    private Set<EmployeeDocument> documents;

    @Max(1)
    @Min(-1)
    @Column(name = "status", nullable = false )
    public Integer status;

    @Column(name = "created_by", updatable = false)
    public Integer createdById;

    @Column(name = "updated_by")
    public Integer updatedById;
}

@Entity
@Table(name = "employee_document")
public class EmployeeDocument extends AbstractTimestampEntity implements Serializable {
    private static final long serialVersionUID = 1L;

    @Transient
    public static final Integer STATUS_INACTIVE = 0;
    @Transient
    public static final Integer STATUS_ACTIVE = 1;
    @Transient
    public static final Integer STATUS_ARCHIVED = -1;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    public Integer id;

    @JsonIgnore
    @ManyToOne
    @JoinColumn(name = "employee_id", nullable = false)
    public Employee employee;

    @OneToOne
    @JoinColumn(name = "file_id")
    public EmployeeFile employeeFile;

    @Max(1)
    @Min(-1)
    @Column(name = "status", nullable = false )
    public Integer status;

    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "created_by", updatable = false)
    @JsonBackReference
    public Employee createdBy;

    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "updated_by")
    @JsonBackReference
    public Employee updatedBy;
}

我做错了什么?提前感谢。

您试图从员工文档中引用员工三次,但其中只有一次是通过主键引用的。其他两个由非主键列引用,您还需要使用
referencedColumnName
选项来实现此功能:

@JsonIgnore
@ManyToOne
@JoinColumn(name = "employee_id", nullable = false)
public Employee employee;


@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "created_by", referencedColumnName="created_by", updatable = false)
@JsonBackReference
public Employee createdBy;

@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "updated_by". , referencedColumnName="updated_by")
@JsonBackReference
public Employee updatedBy;

嗯,错误信息说明了一切。employee_文档的_by创建的列由基类中的字段createdById映射,也由EmployeeDocument中的ManyTone createdBy映射。那是无效的。createdBy显然是所有实体中的一个技术列,包含某个东西的ID(它没有文档记录,所以很难说),createdBy是文档与其员工之间的功能关联,因此需要映射到不同的列。我不明白。在EmployeeDocument类中,createdBy映射到Employee表的id字段。那么您建议做什么更改?否。它映射到createdBy列。请参阅
@JoinColumn(name=“created_by”,updateable=false)
。此联接列是员工ID的外键。我已经说过我建议的更改:createdBy是文档与其员工之间的函数关联,因此需要映射到其他列。。
@JsonIgnore
@ManyToOne
@JoinColumn(name = "employee_id", nullable = false)
public Employee employee;


@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "created_by", referencedColumnName="created_by", updatable = false)
@JsonBackReference
public Employee createdBy;

@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "updated_by". , referencedColumnName="updated_by")
@JsonBackReference
public Employee updatedBy;