- 单向多对一关系
//产品类型 一的一方
@Entity
public class ProductDir {
@Id
@GeneratedValue
private Long id;
private String name;
}
//产品,多方
@Entity
public class Product {
@Id
@GeneratedValue
private Long id;
private String name;
//一方的对象
@ManyToOne //默认配置的ManyToOne 会自定键为外键,外键的名称=属性名_id
//多个产品Product对应一个产品类型dir
// 不能使用@Column(name = "dir_id")
@JoinColumn(name = "dir_id")
private ProductDir dir;
}
junit
@Test
public void testSaveProduct() {
Product product = new Product();
product.setName("牛逼");
productService.save(product);
System.out.println("保存成功->"+product);
Product product2 = new Product();
product2.setName("牛逼2");
product2.setDir(new ProductDir());
try {
productService.save(product2);
}catch (Exception e){
System.out.println("该操作会报错->因为一的那方没有id,即缺少外键关系");
}
Product product3 = new Product();
product3.setName("牛逼2");
ProductDir productDir = new ProductDir();
productDir.setName("牛逼的类型");
productDirService.save(productDir);
product3.setDir(productDir);//此时的产品类型有了id
productService.save(product3);
System.out.println("保存成功->"+product3);
System.out.println("保存成功->"+productDir);
}
@ManyToOne(fetch = FetchType.EAGER) 默认抓取策略,及时加载,一条sql语句
@OneToMany(fetch = FetchType.LAZY) 延时加载,多条sql语句(多的一方默认延时加载)
- 单向一对多关系
//产品,多方
@Entity
public class Product2 {
@Id
@GeneratedValue
private Long id;
private String name;
}
//产品类型 一的一方
@Entity
public class ProductDir2 {
@Id
@GeneratedValue
private Long id;
private String name;
//单向一对多
@OneToMany
//必须配置外键id,否则会多生成一张表吗,形成多对多的关系
@JoinColumn(name = "dir_id")//建议在一的一方实例化集合
//(便于后面保存操作)
private Set products = new HashSet<>();
}
junit
@Test
public void testSaveProduct2() {
Product2 product11 = new Product2();
product11.setName("产品11");
Product2 product22 = new Product2();
product22.setName("产品22");
ProductDir2 productDir2 = new ProductDir2();
productDir2.setName("牛逼2");
productDir2.getProducts().add(product11);
productDir2.getProducts().add(product22);
product2Service.save(product11);//保存后得到主键
product2Service.save(product22);//即获得外键关系
productDir2Service.save(productDir2);
System.out.println("保存成功->"+productDir2);
System.out.println("保存成功->"+product11);
System.out.println("保存成功->"+product22);
}
排序
//单向一对多
@OneToMany
//必须配置外键id,否则会多生成一张表吗,形成多对多的关系
@JoinColumn(name = "dir_id")//建议在一的一方实例化集合(便于后面保存操作)
@OrderBy("id")//默认属性值,不写即升序,
//@OrderBy("id DESC")
private Set products = new HashSet<>();
- 双向一对多关系
//产品,多方
@Entity
public class Product {
@Id
@GeneratedValue
private Long id;
private String name;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "dir_id")
private ProductDir dir;
}
//产品类型 一的一方
@Entity
public class ProductDir {
@Id
@GeneratedValue
private Long id;
private String name;
@OneToMany(fetch = FetchType.LAZY,mappedBy = "dir")
//双向一对多,不配置@JoinColumn,配置新的属性mappedBy = "dir"
//表示一方的关系参照多方Product属性dir来管理
private Set products = new HashSet<>();
}