Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.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 我什么时候应该在JPA中使用@JoinColumn或@JoinTable?_Java_Hibernate_Jpa_Orm_Hibernate Mapping - Fatal编程技术网

Java 我什么时候应该在JPA中使用@JoinColumn或@JoinTable?

Java 我什么时候应该在JPA中使用@JoinColumn或@JoinTable?,java,hibernate,jpa,orm,hibernate-mapping,Java,Hibernate,Jpa,Orm,Hibernate Mapping,@JoinColumn给一个实体另一个实体一个外键,而@JoinTable将列出实体a和实体B之间的所有关系。据我所知,它们似乎都做了类似的事情。什么时候应该使用一个或另一个?假设您有一个实体A,它与一个实体B有@manytone关联 将在使用目标实体表(例如B)时定义目标表外键(例如B) 将使用单独的表来保存a和B之间的关系 @Entity public class A { private Long id; @ManyToOne @JoinColumn(name="

@JoinColumn
给一个
实体
另一个
实体
一个外键,而
@JoinTable
将列出
实体
a和
实体
B之间的所有关系。据我所知,它们似乎都做了类似的事情。什么时候应该使用一个或另一个?

假设您有一个实体
A
,它与一个实体
B
@manytone
关联

将在使用目标实体表(例如
B
)时定义目标表外键(例如
B

将使用单独的表来保存
a
B
之间的关系

@Entity
public class A {

    private Long id;

    @ManyToOne
    @JoinColumn(name="B_ID")
    private B b;

}
@Entity
public class A {

    private Long id;

    @ManyToOne
    @JoinTable(
       name = "A_B", 
       joinColumns = @JoinColumn(name = "B_ID"), 
       inverseJoinColumns = @JoinColumn(name = "A_ID")
    )
    private B b;

}

这次
A
B
都不包含任何外键,因为有一个单独的表(例如
A\u B
)来保存
A
B

。@JoinTable将两个表的id存储到一个单独的表中,而@JoinColumn将另一个表的id存储到一个新列中

@Entity
public class A {

    private Long id;

    @ManyToOne
    @JoinColumn(name="B_ID")
    private B b;

}
@Entity
public class A {

    private Long id;

    @ManyToOne
    @JoinTable(
       name = "A_B", 
       joinColumns = @JoinColumn(name = "B_ID"), 
       inverseJoinColumns = @JoinColumn(name = "A_ID")
    )
    private B b;

}
@JoinTable:这是默认类型。当您需要更规范化的数据库时,请使用此选项。即减少冗余


@JoinColumn:使用它可以获得更好的性能,因为它不需要连接额外的表

一个重要区别
@JoinColumn
始终使用它:

  • 如果联接用于使用外键映射策略的一对一映射或多对一映射,则外键列位于
    源实体或可嵌入
  • 如果联接用于使用外键映射策略的单向OneToMany映射,则外键位于 目标实体
  • 如果联接用于多个映射或使用联接表的一对一或双向多对一/一对一映射,则
    外键位于联接表中
  • 如果联接用于元素集合,则外键位于集合表中

那么JoinTable是一种N-N关系吗?在数据库术语中,它是一种多对多关联。在这种情况下,一个FK将具有唯一的约束,以将其转换为与联接表的一对多关联。