Java SpringBootJPA:多对多关系作为它自己的类?
我正在使用SpringBoot和JPA,两个表之间存在多对多关系。这个关系也需要有它自己的属性,所以我必须使这个关系成为它自己的类。我也有所有类的存储库。另外,在使用非基本字段时,如何正确映射外键 我的问题:我如何认识到这一点,这样Spring boot就不会给我一个错误?我对Spring Boot和JPA都是新手。下面是一段代码片段: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
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”进行映射)
谢谢,现在我不再遇到此问题。