1. 程式人生 > >JPA 多對多關聯  中間錶帶有屬性 兩個外來鍵作為中間表的聯合主鍵時 直接操作中間表查詢修改的方法

JPA 多對多關聯  中間錶帶有屬性 兩個外來鍵作為中間表的聯合主鍵時 直接操作中間表查詢修改的方法

因為中間錶帶有屬性,採用的多對多對映方式 兩個實體類都使用   @OneToMany( mappedBy="workDateTime")

需求:因為中間表使用兩個外來鍵作為聯合主鍵 ,如果需要對中間表的屬性進行修改,

1、一般做法

從實體類獲取中間表的集合,然後遍歷中間表的集合,然後修改。

WorkDateTime.getWorkDateTimeProducts()

2、一般做法很麻煩,如果條件還需要判斷ProductId,則更麻煩

直接採用中間表倉庫的做法

1)、建立聯合主鍵

聯合主鍵 

public class WorkDateTimeProductKey

  implements Serializable{

       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 ;

}