JPA 多對多關聯 中間錶帶有屬性 兩個外來鍵作為中間表的聯合主鍵時 直接操作中間表查詢修改的方法
因為中間錶帶有屬性,採用的多對多對映方式 兩個實體類都使用 @OneToMany( mappedBy="workDateTime")
需求:因為中間表使用兩個外來鍵作為聯合主鍵 ,如果需要對中間表的屬性進行修改,
1、一般做法
從實體類獲取中間表的集合,然後遍歷中間表的集合,然後修改。
WorkDateTime.getWorkDateTimeProducts()
2、一般做法很麻煩,如果條件還需要判斷ProductId,則更麻煩
直接採用中間表倉庫的做法
1)、建立聯合主鍵
聯合主鍵
public class WorkDateTimeProductKey
private static final long serialVersionUID = 3586335994284551414L;
private Product product;
private WorkDateTime workDateTime;
}
2)、中間表的倉庫
public interface WorkDateTimeProductRepository extends JpaRepository<WorkDateTimeProduct, Long> {
WorkDateTimeProduct findByWorkDateTime_IdAndProduct_Id(long workDateTimeId ,long productId);
}
3)由於業務上,經常會知道兩個實體類的主鍵,就可以通過此方法:findByWorkDateTime_IdAndProduct_Id ()查詢到WorkDateTimeProduct,然後直接修改
WorkDateTime_Id 其中 _的意思是 查詢WorkDateTimeProduct 的 WorkDateTime 的 id屬性
4)測試程式碼
@SpringBootTest
@RunWith(SpringRunner.class)
public class WorkDateTimeProductRepositoryTest {
@Autowired
WorkDateTimeProductRepository WorkDateTimeProductRepository;
@Test
public void findByWorkDateTimeIdAndProductIdTest(){
WorkDateTimeProduct workDateTimeProduct =WorkDateTimeProductRepository.findByWorkDateTime_IdAndProduct_Id(12l, 13l);
workDateTimeProduct.getAmount();
System.out.println(workDateTimeProduct.getAmount());
}
}
實體類1
@Entity
//@JsonIgnoreProperties(value={"workDateTimeProducts"})
public class WorkDateTime implements Serializable {
private static final long serialVersionUID = 6788933059497808914L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private long id ;
@JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date dinnerDay;
private byte dinnerTime; // 1noon 中餐,2 evening 晚餐,3 morning
private byte state; //訂餐時間段是否有效
@OneToMany( mappedBy="workDateTime")
private List<WorkDateTimeProduct> workDateTimeProducts = new ArrayList<WorkDateTimeProduct>();
private byte printAllow; //1為不可以打 2為可以打,
}
實現類2
@Entity
//@JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" })
public class Product implements Serializable{
private static final long serialVersionUID = -3700731687896498304L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private long id ;
private String name;
private String description;
private short amount ;
private short price ;
private String productImg;
@OneToMany(mappedBy="product")
List<WorkDateTimeProduct> workDateTimeProducts =new ArrayList<WorkDateTimeProduct> ();
}
中間表
@Entity
@IdClass(WorkDateTimeProductKey.class)
public class WorkDateTimeProduct implements Serializable{
private static final long serialVersionUID = 1207408560047174539L;
@Id
@ManyToOne()
@JoinColumn(name="product_id")
private Product product;
@Id
@JsonIgnore
@ManyToOne()
@JoinColumn(name="workdatetime_id")
private WorkDateTime workDateTime;
private byte state;
private short amount ;
}