---
title: March 2025
versions:
  cdsjs: 8.9.0+
  cdsdk: 8.9.0+
  cdsc: 5.9.0+
  cdsmtxs: 2.7.0+
  java: 3.9.0+
---

# March 2025

<ReleaseBadges />


[[toc]]

## Prepare for Major Release

Along with new features, the next major release CDS 9 will contain some changes that you'll need to react on.
For the items listed below, you can do this already **now**, which eases the transition. You can't use the mentioned **deprecated functions** with the CDS 9 release. The corresponding compatibility flags won't be respected any longer.

- [**Migrate** ESLint Configuration](feb25#migrate-eslint-configuration)
- [**Add** Test Support Package](feb25#add-test-support-package)
- [**Switch on** the new CDS parser.](feb25#new-parser)
- [**Upgrade to** `@sap/xssec 4`.](jan25#upgrade-to-sapxssec-4) _--> remove compat flag_
- [**Switch on** OData containment.](../2024/dec24#odata-containment)
- [**Adapt to changed behavior** when processing `@restrict.where` checks.](../2024/dec24#consolidated-authorization-checks)
- [**Adopt** @cap-js database services now.](../2024/jun24#new-database-services-ga)
- [**Switch on** the new protocol adapters.](../2024/jun24#new-protocol-adapters-ga) _--> remove compat flag_
- [**Switch on** lean draft.](../2024/jun24#lean-draft) _--> remove compat flag_

## CDS Language & Compiler {#cds}

### New Parser

Switch over to the new parser already now.
Set option <Config showPrivate>cds.cdsc.newparser: true</Config> in your private `~/.cdsrc.json` to switch on
the new parser on your local machine. Switch it on in your project's development and test pipelines.
If that's successful, use it in production.

### Actions in Composition of Aspects

Actions and functions of a CDS aspect are now available in the generated child entity when defining a composition of aspect.

In this example, the compiler-generated child entity `Orders.items` has an action `close`:

```cds
aspect Item {
  key id : String;
} actions {
  action close(); // [!code highlight]
};

entity Orders {
  key id : String;
  items: Composition of Item; // [!code highlight]
};
```

[Learn more about the composition of aspects.](/@external/cds/cdl#managed-compositions ){.learn-more}


## Node.js {#cds-js}

### Recursive Hierarchies and Fiori Tree Table Support <Beta />

CAP Node.js now supports [Recursive Hierarchies](https://sap.github.io/odata-vocabularies/vocabularies/Hierarchy.html) with OData v4 on SAP HANA Cloud, allowing to serve read requests for the [SAP Fiori Tree Table](https://experience.sap.com/fiori-design-web/tree-table/), including sort, filter, and search on hierarchical data.

<video src="./assets/mar25/tree-view-node_compressed.mp4" autoplay loop muted webkit-playsinline playsinline alt="Video demonstrating a nested tree in an SAP Fiori Elements application, incl. expanding, collapsing and searching for elements" class="bright"/>

You can try it out in our [bookshop sample for SAP Fiori](https://github.com/capire/bookstore/blob/main/app). Simply run
- `cds deploy -2 hana --production`
- `cds watch --profile hybrid`

The `Browse Genres` app as well as the value help for `Genres` in the `Manage Books` app use the SAP Fiori Tree Table.


## Java {#cds-java}

### Log CDS Configuration

Upon start-up, you can now get an overview of the configured [CDS properties](/@external/java/developing-applications/properties). Turn on by setting the log level for `com.sap.cds.properties` to `DEBUG` in the _application.yaml_ file:

::: code-group
```yaml [srv/src/main/resources/application.yaml]
logging:
  level:
    com.sap.cds.properties: DEBUG  # [!code highlight]
```
:::

::: details Sample output:

```sh
... DEBUG ... com.sap.cds.properties : 'cds.dataSource.autoConfig.enabled': 'false' (default: 'true')
... DEBUG ... com.sap.cds.properties : 'cds.dataSource.embedded': 'true' (default: 'false')
...  WARN ... com.sap.cds.properties : 'cds.security.authorization.emptyAttributeValuesAreRestricted': 'false' (default: 'true', deprecated, not documented)
... DEBUG ... com.sap.cds.properties : 'cds.security.mock.users.admin.name': 'admin'
... DEBUG ... com.sap.cds.properties : 'cds.security.mock.users.admin.password': '***' (sensitive)
... DEBUG ... com.sap.cds.properties : 'cds.security.mock.users.admin.roles[0]': 'admin'
... DEBUG ... com.sap.cds.properties : 'cds.security.mock.users.admin.roles[1]': 'cds.Developer'
... DEBUG ... com.sap.cds.properties : 'cds.security.mock.users.admin.attributes.businessPartner[0]': '10401010'
... DEBUG ... com.sap.cds.properties : 'cds.odataV4.endpoint.path': '/api' (default: '/odata/v4')
... DEBUG ... com.sap.cds.properties : 'cds.errors.defaultTranslations.enabled': 'true' (default: 'false')
```
:::

### Miscellaneous

* Subscription dependencies for _portal_ and _html5-apps-repo_ are automatically created if the corresponding service is bound to the CAP Java application.
* The result of the execution of a `CqnUpsert` statement now provides an [entity reference](/@external/java/working-with-cql/query-execution#entity-refs) to the upserted entity via the `Row.ref()` method.



## Multitenancy {#cds-mtxs}

### Extension Drafts <Beta/>

The API [`PUT /-/cds/extensibility/Extensions/<id>`](/@external/guides/multitenancy/mtxs#put-extensions) can now be used to upload extensions as drafts. This allows to trigger the upload, validation, and activation of extensions separately.

Example:
```http [Request]
PUT /-/cds/extensibility/Extensions/isbn-extension HTTP/1.1
Content-Type: application/json

{
  "csn": ["using my.bookshop.Books from '_base/db/data-model';
           extend my.bookshop.Books with { Z_ISBN: String };"],
  "i18n": [{ "name": "i18n.properties", "content": "Books_stock=Stock" },
           { "name": "i18n_de.properties", "content": "Books_stock=Bestand" }],
  "status": 1 // draft = 1, activation = 2 [!code highlight]
}
```
This request adds an extension with `ID` `isbn-extension` as draft. It will not be publicly visible and necessary changes are not deployed to the database.
```http [Request]
POST /-/cds/extensibility/validate HTTP/1.1
Content-Type: application/json

{
  "ID": "isbn-extension"
}
```
This request validates the extension with `ID` `isbn-extension`.
```http [Request]
POST /-/cds/extensibility/Extensions/activate HTTP/1.1
Content-Type: application/json

{
  "ID": "isbn-extension",
  "status": 2 // target status 2 = activation [!code highlight]
}
```


This request promotes the extension with `ID` `isbn-extension` to status `2`, making it visible to everyone and applying any necessary changes to the database. Note that `2` is the default value for `status`, so it can be omitted if the goal is to make extensions publicly visible.

Please note: `status` was `level` in the first version of the API.

## Tools { #tools}

### Deployment With `cds up` <Beta /> {#cds-up}

Given you have fulfilled the prerequisites for [Cloud Foundry](/@external/guides/deploy/to-cf#prerequisites) or [Kyma](/@external/guides/deploy/to-kyma#prerequisites) deployments, a new command allows for a simpler way to build and deploy CAP applications:

```sh
cds up
```

This deploys your CAP app to Cloud Foundry by default.

::: details Essentially, this command automates the following steps...

```sh
# Depending on your deployment method...
cds add mta # Cloud Foundry
cds add helm,containerize # Kubernetes

# Installing app dependencies, e.g.
npm i app/browse
npm i app/admin-books

# If project is multitenant
npm i --package-lock-only mtx/sidecar

# If package-lock.json doesn't exist
npm i --package-lock-only

# Final assembly and deployment...

### Cloud Foundry
mbt build -t gen --mtar mta.tar
cf deploy gen/mta.tar -f

### Kyma/Kubernetes, e.g.
ctz containerize.yaml --log --push
helm upgrade --install bookshop ./gen/chart --wait --wait-for-jobs --set-file xsuaa.jsonParameters=xs-security.json
kubectl rollout status deployment bookshop-srv --timeout=8m
kubectl rollout status deployment bookshop-approuter --timeout=8m
kubectl rollout status deployment bookshop-sidecar --timeout=8m
```

:::

For Kyma (Kubernetes), simply run:

```sh
cds up --to k8s
```

### Initial Type Generation With `cds watch`

[`cds-typer`](/@external/tools/cds-typer) is now run once by `cds watch`.
This is useful for newly cloned projects to generate the model types initially. For example, model imports like this no longer error out at startup:

::: code-group
```js [srv/cat-service.js]
const { Books } = require('#cds-models/sap/capire/bookshop')
```
:::

Manual invocations, like `npx cds-typer`, are no longer needed for this local scenario but still relevant for CI workflows, though.

### Ad-hoc SAP HANA Deployment on Kyma

[`cds deploy --to hana`](/@external/guides/databases/hana#cds-deploy-hana) is now also supported for Kubernetes:

```sh
cds deploy --to hana:<binding or secret name> --on k8s
```

> Omitting the binding or secret name creates a new HDI container and binding called `<appName>-db-binding`.
