簡體   English   中英

Spring Data JPA - 具有復合鍵的實體,其中一列是與另一列相關的內部序列

[英]Spring Data JPA - Entities with composite key in which one column is an internal sequence related to the other

我在 Oracle 數據庫中有一個如下所示的表:

| GROUP | SEQ | OTHER_DATA |
|-------|-----|------------|
| 1     | 1   | ~~~~~~~~~~ |
| 1     | 2   | ~~~~~~~~~~ |
| 1     | 3   | ~~~~~~~~~~ |
| 2     | 1   | ~~~~~~~~~~ |
| 2     | 2   | ~~~~~~~~~~ |
| 2     | 3   | ~~~~~~~~~~ |

其中GROUP是外鍵, (GROUP, SEQ)是主鍵。 我想插入第 1 組的下一條記錄,應該是(1, <(MAX SEQ FOR GROUP 1) + 1>, <OTHER DATA>) = (1, 4, <OTHER DATA>)

我正在使用 Spring Boot 2。到目前為止,我有以下內容:

public class MyEntityPK implements Serializable {
    private Long group;
    private Long seq;
    // getters and setters ...
}

@Entity
@Table(name = "MY_TABLE")
@IdClass(MyEntityPK.class)
public class MyEntity {

    @Id
    private Long group;

    @Id
    private Long seq;

    @ManyToOne
    @JoinColumn(name="GROUP", insertable=false, updatable=false)
    private Group group;

    private String otherData;
    // getters and setters ...
}

public interface MyEntityRepository extends CrudRepository<MyEntity, MyEntityPK> {}

當我顯式設置seq字段時,如下例所示,一切正常。

@RunWith(SpringRunner.class)
@SpringBootTest
public class MyEntityTest {

    @Autowired
    MyEntityRepository repository;

    @Test
    public void testSaveMyEntityWithExplicitParameters() {
        MyEntity entity = new MyEntity();
        Group group = new Group(1L, "Group description");
        entity.setGroup(group);
        entity.setSeq(4L);
        repository.save(entity);
    }
}

但是我無法弄清楚如何在持久層中增加序列,而不向使用MyEntityRepository的服務添加邏輯來獲取最大 seq 值並顯式設置它。 我不能將@GeneratedValue與序列生成器一起使用,因為它會在不考慮組的情況下生成下一個可用值。

作為建議,您可以嘗試觸發器,請找到原始示例:

CREATE OR REPLACE TRIGGER seq_upd_before_insert
BEFORE INSERT
   ON MY_TABLE
   FOR EACH ROW
DECLARE
   v_seq number;
BEGIN
   -- Find max seq for performing INSERT into your table
   SELECT max(seq) INTO v_seq 
   FROM MY_TABLE
   WHERE group = :new.group
   GROUP BY group;

   -- Update new seq field to max seq + 1 before insert
   :new.seq := v_seq + 1;
END;
/

希望能幫助到你

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM