Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.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 SpringBootJPA:多对多关系作为它自己的类?_Java_Spring_Spring Boot_Jpa - Fatal编程技术网

Java SpringBootJPA:多对多关系作为它自己的类?

Java SpringBootJPA:多对多关系作为它自己的类?,java,spring,spring-boot,jpa,Java,Spring,Spring Boot,Jpa,我正在使用SpringBoot和JPA,两个表之间存在多对多关系。这个关系也需要有它自己的属性,所以我必须使这个关系成为它自己的类。我也有所有类的存储库。另外,在使用非基本字段时,如何正确映射外键 我的问题:我如何认识到这一点,这样Spring boot就不会给我一个错误?我对Spring Boot和JPA都是新手。下面是一段代码片段: import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; im

我正在使用SpringBoot和JPA,两个表之间存在多对多关系。这个关系也需要有它自己的属性,所以我必须使这个关系成为它自己的类。我也有所有类的存储库。另外,在使用非基本字段时,如何正确映射外键

我的问题:我如何认识到这一点,这样Spring boot就不会给我一个错误?我对Spring Boot和JPA都是新手。下面是一段代码片段:

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import javax.persistence.*;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.io.Serializable;

@Entity //this is a relationship type. Does an annotation for relationship types exist?
@Embeddable
@Getter
@Setter
@NoArgsConstructor
public class RelationshipType implements Serializable {

    @Id
    private Long id;

    @NotNull
    @JoinColumn(name="id")
    private Class1 class1;

    @NotNull
    @JoinColumn(name="code")
    private Class2 class2;


    private Integer anotherNumber;
}

它应该类似于下面的示例。您需要将与其他表的关系设置为
@ManyToOne
,以获得所需的
@ManyToOne
Employee和Number之间的关系

@Entity
@Getter
@Setter
@Table(name = "employees_numbers")
public class EmployeeNumber {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "employee_id", nullable = false)
    private Employee employee;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "number_id", nullable = false)
    private Number number;

    @Column(name = "extra_column", nullable = false)
    private String extraColumn;
}
旁注:不要对整数使用
@NotEmpty
。它是专门为收藏而设计的


旁注2:我将在这里一瘸一拐地说,您想要的是在列中添加
nullable=false
,而不是将它们标记为
@NotNull
。这两者之间有很大区别。

您编写的代码有什么问题?“所以Spring boot没有给我一个错误”你没有描述任何错误。事情是,由于我现在必须做的更改,我得到了一个“class2没有定义@Idclass”错误,这显然需要首先修复。一旦我解决了这个问题,我就会编辑这篇文章,并说明解决方案是否有效。我采纳了您的更改,并在id中添加了以下注释:
@GeneratedValue(strategy=GenerationType.IDENTITY)@Column(name=“id”,insertable=false,updateable=false)
现在它说:
Column:id(应该用insert映射)=“false”update=“false”)
如果你想在多对多关系中添加额外字段,你必须创建一个单独的实体并插入和/或更新它。它不适合你的原因可能是因为你留下了
@embeddeble
或其他一些注释,这些注释可能会向休眠发出信号,表明这是一个不需要实例化、插入的实体我实际上删除了
@embeddeble
注释,并且我的注释与您的注释相匹配(我仍然有
@noargsconstuctor'
),下面是我得到的完整错误消息:
org.springframework.beans.factory.BeanCreationException:创建名为“entityManagerFactory”的bean时出错,该bean在类路径资源中定义[org/springframework/boot/autoconfigure/orm/jpa/hibernatejbaconfiguration.class]:初始化方法调用失败;嵌套异常为javax.persistence.PersistenceException:[PersistenceUnit:default]无法构建Hibernate SessionFactory;嵌套异常为org.Hibernate.MappingException:实体映射中的重复列:de.models.RelationshipType列:id(应使用insert=“false”update=“false”进行映射)
谢谢,现在我不再遇到此问题。