When developing applications using Oracle ADF, one of the most important architectural decisions is where to place your business logic - in the database using PL/SQL or in the middle layer using Java.
Making the wrong choice does not just affect code readability - it impacts performance, scalability, and long-term maintainability.
This guide provides clear, experience-based direction on how to decide what belongs where.
Understanding the Architecture
An Oracle ADF application typically consists of three layers:
- Database Layer - PL/SQL, Stored Procedures, Functions
- Middle Layer - ADF Business Components (Entity Object, View Object, Application Module)
- UI Layer - JSF Pages
A simple guiding principle:
- Keep logic close to where it performs best and is easiest to maintain
When to Use PL/SQL
1. Heavy Data Processing
If your logic involves large datasets, complex joins, aggregations, or bulk operations, PL/SQL is the right choice.
Why:
- Data processing happens inside the database
- Minimal data transfer between layers
- Better performance for large-scale operations
Examples:
- Financial calculations across thousands of records
- Batch updates or scheduled jobs
- Complex reporting queries
2. Transaction-Critical Operations
For operations where data integrity is critical, PL/SQL provides strong transactional control.
Why:
- Database ensures atomicity and consistency
- Easier rollback and commit handling
Examples:
- Payment processing
- Inventory updates
- Ledger entries
3. Reusable Database Logic
If the same logic is required by multiple systems or modules, placing it in PL/SQL ensures consistency.
Examples:
- Validation rules shared across applications
- Common calculation formulas
- Data transformation logic
4. Data-Intensive Validations
Validations that depend on large datasets or multiple table checks should be handled in PL/SQL.
Why:
- Avoids unnecessary data fetching into the application layer
- Faster execution within the database
When to Use Java (ADF Business Components)
1. Application-Level Business Logic
Logic related to application behavior, workflows, or user interaction should reside in Java.
Examples:
- Conditional UI-driven logic
- Role-based processing
- Dynamic behavior based on user actions
2. Entity Object Validations
ADF Entity Objects are ideal for row-level validations and business rules.
Examples:
- Field validation
- Attribute dependencies
- Default value logic
Why:
- Keeps validation close to the data model
- Integrates well with ADF lifecycle
3. Orchestration Logic
When multiple operations need to be coordinated, Java (especially in Application Modules) is the right place.
Examples:
- Calling multiple services or procedures
- Combining different business rules
- Managing application flow
4. Integration with External Systems
Any interaction with APIs, web services, or external systems should always be handled in Java.
Examples:
- REST/SOAP calls
- File processing
- Third-party integrations
What to Avoid
Do Not Put Everything in PL/SQL
- Makes the system rigid
- Harder to debug and maintain
- Reduces flexibility in application logic
Do Not Put Heavy Data Logic in Java
- Causes unnecessary database calls
- Slows down performance
- Increases network overhead
Avoid Duplicating Logic
- Same validation in both PL/SQL and Java leads to inconsistency
- Always define a single source of truth
Practical Decision Guide
Use this quick rule:
- Large data processing - PL/SQL
- Critical transactions - PL/SQL
- Shared logic across systems - PL/SQL
- UI-driven logic - Java
- Workflow and orchestration - Java
- External integrations - Java
Final Thought
PL/SQL and Java are not competitors - they are complementary.
A well-designed ADF application uses both effectively:
- PL/SQL for performance and data integrity
- Java for flexibility and application control
The goal is not to choose one over the other -
but to place each piece of logic where it naturally belongs.
