Hibernate 3.2 in simple steps pdf


Transactions. Preface ibernate ORM (Hibernate in short) is an object- relational mapping framework, facilitating the conversion of an object-oriented As a first step we will create a simple maven project on the command line. Hibernate Read Chapter 1, Introduction to Hibernate for a tutorial with step-by-step . In the next step, we tell Hibernate about this persistent class. Tutorial 4 – Hibernate, HSQL Database, Maven and Eclipse. This tutorial assumes To keep things simple, I will be using HypersonicSQL (aka HSQL) database, which is easy to use. This is an . ga. . Next step is to create the Hibernate configuration file “hibernate. nbafinals.info” under.

Language:English, Spanish, Arabic
Genre:Fiction & Literature
Published (Last):02.10.2015
Distribution:Free* [*Sign up for free]
Uploaded by: MARILEE

71686 downloads 133863 Views 40.58MB PDF Size Report

Hibernate 3.2 In Simple Steps Pdf

Lazy initialization, a Hibernate problem. Java Persistence versus Hibernate .. .. Hibernate API. The basic idea of object relation mapping - ORM is to map database tables to a class. In order to get complete our application, we must undertake the following steps. Implementing POJO associations. Adding logic to accessor methods. Defining the mapping metadata. Metadata in XML. Basic property . Query information spread across several tables 9 □. Searching .. We will walk you through the steps of marking an entity and a property as indexed. Hibernate Search x is compatible with Hibernate Core x starting from. 2.

Alternatively, you may use Maven. I like it just for managing my libraries. We need a JBoss repository. My IntelliJ project deployed unintentionally the el-api. This provokes a problem on Tomcat 6 and JBoss 4. Just make sure that it is not deployed or exclude it. Here is the pom. It will redirect us to the hello page. Our application will deal with hedgehogs and the first thing to be done is to print a list of hedgehogs.

Hottest comment thread. Recent comment authors. Arun J. Hi Sir could you post an example for self join one-to-many with create and select operation. Mahesh Parmar.

Venkatareddy Polimireddy. Thanks a lot. Dilip Yadav Mahto. Amit Swain. Thanks in advance. Hi Sir, i am using session to write a bulk of entities to DB in first 3 hours i have dumping rate around record per minute but after that the rate go down to be records per minute.

Mostly used for Null pointer exception eg: Cody Veit. Thanks for sharing. You can execute sql queries by createSQLQuery method in hibernate.

Load More Comments. Our application will deal with hedgehogs and the first thing to be done is to print a list of hedgehogs. Create a class Hedgehog.

It is a Seam component. We will see later that we can reference the component using the name. Our service class provides a data model for a JSF data table - hedgehogs.

Name; import org. Scope; import org. DataModel; import org.

We show the business layer above the persistence layer, since the business layer acts as a client of the persistence layer in a traditionally layered application.

The Hibernate interfaces shown in figure 2. They include Session, Transaction, and Query. These interfaces are implemented by application infrastructure code if necessary. JDBC provides a rudimentary level of abstraction of functionality common to relational databases, allowing almost any database with a JDBC driver to be supported by Hibernate. You can find most of these interfaces in the package net. Using these interfaces, you can store and retrieve persistent objects and control transactions.

Session interface The Session interface is the primary interface used by Hibernate applications. An instance of Session is lightweight and is inexpensive to create and destroy. This is important because your application will need to create and destroy sessions all the time, perhaps on every request.

Hibernate sessions are not threadsafe and should by design be used by only one thread at a time. The Hibernate notion of a session is something between connection and transaction. It may be easier to think of a session as a cache or collection of loaded objects relating to a single unit of work. Hibernate can detect changes to the objects in this unit of work. Note that a Hibernate session has nothing to do with the web-tier HttpSession.

When we use the word session in this book, we mean the Hibernate session. We sometimes use user session to refer to the HttpSession object. We describe the Session interface in detail in chapter 4, section 4.

Compared to the Session interface, this object is much less exciting. The SessionFactory is certainly not lightweight! There is typically a single SessionFactory for the whole application—created during application initialization, for example. It also holds cached data that has been read in one unit of work and may be reused in a future unit of work only if class and collection mappings specify that this second-level cache is desirable.

Licensed to Jose Carlos Romero Figueroa Understanding the architecture 39 Configuration interface The Configuration object is used to configure and bootstrap Hibernate. The application uses a Configuration instance to specify the location of mapping documents and Hibernate-specific properties and then create the SessionFactory.

Section 2. Hibernate applications may choose not to use this interface, instead managing transactions in their own infrastructure code. This helps to keep Hibernate applications portable between different kinds of execution environments and containers. Transactions and the Transaction interface are explained in chapter 5. Query and Criteria interfaces The Query interface allows you to perform queries against the database and control how the query is executed.

A Query instance is used to bind query parameters, limit the number of results returned by the query, and finally to execute the query. The Criteria interface is very similar; it allows you to create and execute objectoriented criteria queries. To help make application code less verbose, Hibernate provides some shortcut methods on the Session interface that let you invoke a query in one line of code.

We describe the features of the Query interface in chapter 7. The Lifecycle and Validatable interfaces allow a persistent object to react to events relating to its own persistence lifecycle. The Hibernate team was heavily influenced by other ORM solutions that have similar callback interfaces. The Interceptor interface was introduced to allow the application to process callbacks without forcing the persistent classes to implement Hibernate-specific APIs.

Implementations of the Interceptor interface are passed to the persistent instances as parameters. A Hibernate Type object maps a Java type to a database column type actually, the type may span multiple columns. All persistent properties of persistent classes, including associations, have a corresponding Hibernate type.

This design makes Hibernate extremely flexible and extensible. There is a rich range of built-in types, covering all Java primitives and many JDK classes, including types for java. Currency, java. Calendar, byte[], and java.

Even better, Hibernate supports user-defined custom types. You can use this feature to allow commonly used application classes such as Address, Name, or MonetaryAmount to be handled conveniently and elegantly. We explain Hibernate types and user-defined types in chapter 6, section 6. When the built-in strategies are insufficient, Hibernate will usually let you plug in your own custom implementation by implementing an interface.

Extension points include: The source code is available for you to use as an example for your own implementation. By now you can see that before we can start writing any code that uses Hibernate, we must answer this question: How do we get a Session to work with?

To use Hibernate in an application, you need to know how to configure it. Hibernate can be configured to run in almost any Java application and development environment.

Although we concentrate on multitiered web applications in this book, our explanations apply equally to other architectures, such as commandline applications. A servlet container like Jetty or Tomcat provides a nonmanaged server environment for Java web applications. A stand-alone desktop or command-line application is also considered non-managed. The application itself manages database connections and demarcates transaction boundaries. In the case of a non-managed environment, Hibernate handles transactions and JDBC connections or delegates to application code that handles these concerns.

In managed environments, Hibernate integrates with container-managed transactions and datasources. Hibernate can be configured for deployment in both environments. In both managed and non-managed environments, the first thing you must do is start Hibernate. In practice, doing so is very easy: You have to create a SessionFactory from a Configuration.

Once configured, the Configuration instance is used to create the SessionFactory. After the SessionFactory is created, you can discard the Configuration class. The following code starts Hibernate: For example, if the classpath is the current directory, the Message. XML mapping files must be placed in the classpath.

In this example, we also use the system properties of the virtual machine to set all other configuration options which might have been set before by application code or as startup options.

This style is more popular in Smalltalk than in Java and is considered by some people to be less readable and more difficult to debug than the more accepted Java style. Most Java developers declare setter or adder methods to be of type void, meaning they return no value. In Smalltalk, which has no void type, setter or adder methods usually return the receiving object. This would allow us to rewrite the previous code example as follows: Otherwise, it might be difficult to step through the code in your debugger.

By convention, Hibernate XML mapping files are named with the. Another convention is to have one mapping file per class, rather than have all your mappings listed in one file which is possible but considered bad style. Where should we put these mapping files? The Hibernate documentation recommends that the mapping file for each persistent class be placed in the same directory as that class.

For instance, the mapping file for the Message class would be placed in the hello directory in a file named Message. If we had another persistent class, it would be defined in its own mapping file. We suggest that you follow this practice. The monolithic metadata files encouraged by some frameworks, such as the struts-config.

Alternatively, if you follow the convention just described, you can use the method addClass , passing a persistent class as the parameter: If another SessionFactory is needed—if there are multiple databases, for example—you repeat the process.

Each SessionFactory is then available for one database and ready to produce Sessions to work with that particular database and a set of class mappings. Of course, there is more to configuring Hibernate than just pointing to mapping documents. You also need to specify how database connections are to be obtained, along with various other settings that affect the behavior of Hibernate at runtime. To specify configuration options, you may use any of the following techniques: Properties to Configuration.

The first and second options are rarely used except for quick testing and prototypes, but most applications need a fixed configuration file. Both the hibernate.

Which file you choose to use depends on your syntax preference. A rarely used alternative option is to allow the application to provide a JDBC Connection when it opens a Hibernate Session from the SessionFactory for example, by calling sessions.

Of all the configuration options, database connection settings are the most important. They differ in managed and non-managed environments, so we deal with the two cases separately. There are three reasons for using a pool: With Hibernate, the picture changes: It acts as a client of the JDBC connection pool, as shown in figure 2. Using a connection pool Hibernate defines a plugin architecture that allows integration with any connection pool.

Hibernate will set up the configuration pool for you with the given properties. An example of a hibernate. Driver hibernate. PostgreSQLDialect hibernate. So, you must specify a Dialect. Hibernate includes built-in support for all popular SQL databases, and new dialects may be defined easily. An exception will be thrown at runtime if this number is exhausted. Caching of prepared statements is essential for best performance with Hibernate. Specifying properties of the form hibernate. The Javadoc for the class net.

Environment documents every Hibernate configuration property, including all C3P0-related settings and settings for other third-party connection pools directly supported by Hibernate. You should try each pool in your own environment before deciding between them. The Hibernate community tends to prefer C3P0 and Proxool. Hibernate also ships with a default connection pooling mechanism. This connection pool is only suitable for testing and experimenting with Hibernate: You should not use this built-in pool in production systems.

Starting Hibernate How do you start Hibernate with these properties? You declared the properties in a file named hibernate. It will be automatically detected and read when Hibernate is first initialized when you create a Configuration object.

Place the JAR files in the application classpath; do the same with hibernate2. Or, if you want to know more about using Hibernate in a managed environment, read on. J2EE application servers are typical managed environments. Hibernate is often used with session or message-driven EJBs, as shown in figure 2. Session, Transaction, and Query.

The Hibernate-related code is fully portable between non-managed and managed environments. Hibernate handles the different connection and transaction strategies transparently.

An example Hibernate configuration file for this scenario is shown in listing 2. JTATransactionFactory hibernate. JBossTransactionManagerLookup hibernate. The datasource must be configured in the J2EE enterprise application deployment descriptor; this is a vendor-specific setting.

Next, you enable Hibernate integration with JTA. No standard approach is defined by the J2EE specification, but Hibernate includes support for all popular application servers. Finally, of course, the Hibernate SQL dialect is required.

Hibernate in Action (In Action series)

Just create a Configuration with mappings and build a SessionFactory. However, some of the transaction environment—related settings deserve some extra consideration. This is called container-managed transactions CMT. Therefore, managed and non-managed environments can use different transaction methods. Since Hibernate needs to be portable across these environments, it defines an API for controlling transactions.

This underlying transaction strategy is set with the property hibernate. This strategy should be used with a connection pool in a non-managed environment and is the default if no strategy is specified. Note that if a JTA transaction is already in progress when beginTransaction is called, subsequent work takes place in the context of that transaction otherwise a new JTA transaction is started.

Set the factory class for the Hibernate Transaction API to JTA as described earlier, and declare the transaction manager lookup specific to your application server. One of these features may be used with Hibernate: You can configure Hibernate to use this datasource by setting hibernate.

You should now have a running Hibernate system, whether you use a simple servlet container or an application server. Create and compile a persistent class the initial Message, for example , copy Hibernate and its required libraries to the classpath together with a hibernate.

The next section covers advanced Hibernate configuration options. Some of them are recommended, such as logging executed SQL statements for debugging or using the convenient XML configuration file instead of plain properties.

However, you may safely skip this section and come back later once you have read more about persistent classes in chapter 3.

However, there is one parameter that we must emphasize at this point. Setting the property hibernate. Properties programmatically. Unlike hibernate. Many users prefer to centralize the configuration of Hibernate in this way instead of adding parameters to the Configuration in application code.

C The optional name attribute is equivalent to the property hibernate. D Hibernate properties may be specified without the hibernate prefix. Property names and values are otherwise identical to programmatic configuration properties.

E Mapping documents may be specified as application resources or even as hardcoded filenames. When configure was called, Hibernate searched for a file named hibernate. If you wish to use a different filename or have Hibernate look in a subdirectory, you must pass a path to the configure method: You can, for example, use different sets of mapping files and different configuration options , depending on your database and environment development or production , and switch them programatically.

This is useful if you keep some base settings in properties and override them for each deployment with an XML configuration file. The single instance should then be used by all code in a particular process, and any Sessions should be created using this single SessionFactory.

A frequently asked question is where this factory must be placed and how it can be accessed without much hassle. There are many possible implementations of this Registry pattern, including use of the ServletContext or a static final variable in a singleton. A particularly elegant approach is to use an application scope IoC Inversion of Control framework component.

We discuss some of the alternatives in chapter 8, section 8. JNDI implements the Registry pattern. Infrastructural objects transaction contexts, datasources , configuration settings environment settings, user registries , and even application objects EJB references, object factories may all be bound to JNDI. RefFSContextFactory hibernate. JBoss certainly has, so you can skip the last two properties and just specify a name for the SessionFactory. All you have to do now is call Configuration.

Instead, the SQL statements are usually issued at the end of a transaction. This behavior is called write-behind, as we mentioned earlier. This fact is evidence that tracing and debugging ORM code is sometimes nontrivial. Since Hibernate is open source, you can Licensed to Jose Carlos Romero Figueroa Advanced configuration settings 55 easily step into the Hibernate code. Occasionally, doing so helps a great deal! But, especially in the face of asynchronous behavior, debugging Hibernate can quickly get you lost.

Sometimes the SQL alone is insufficient; in that case, you must dig a little deeper. Hibernate logs all interesting events using Apache commons-logging, a thin abstraction layer that directs output to either Apache log4j if you put log4j. This example directs all log messages to the console: ConsoleAppender log4j. PatternLayout log4j. Replacing info with debug for the log4j. Finally, you have the hibernate. There is another way to configure Hibernate, if your application server supports the Java Management Extensions.

A relatively new but important standard is in its first version: JMX is about the management of systems components or, better, of system services. Where does Hibernate fit into this new picture? Hibernate, when deployed in an application server, makes use of other services like managed transactions and pooled database transactions. But why not make Hibernate a managed service itself, which others can depend on and use? The JMX specification defines the following components: An MBean may be packaged as a JMX service, which is not only portable between application servers with JMX support but also deployable to a running system a hot deploy.

So, the configuration options in listing 2. PostgreSQLDialect net. JTATransactionFactory net. JBossTransactionManagerLookup java: The Hibernate MBean may be found in the package net. The methods start and stop of the HibernateService are therefore specific to the JBoss application server.

We recommend that you try to configure Hibernate programmatically using the Configuration object before you try to run Hibernate as a JMX service.

However, some features like hot-redeployment of Hibernate applications may be possible only with JMX, once they become available in Hibernate. Right now, the biggest advantage of Hibernate with JMX is the automatic startup; it means you no longer have to create a Configuration and build a SessionFactory in your application code, but can simply access the SessionFactory through JNDI once the HibernateService has been deployed and started.

You also saw how to configure Hibernate in various environments and with various techniques, even including JMX. The Configuration and SessionFactory interfaces are the entry points to Hibernate for applications running in both managed and non-managed environments. Hibernate provides additional APIs, such as the Transaction interface, to bridge the differences between environments and allow you to keep your persistence code portable. The most important elements of a Hibernate configuration are the database resources connection configuration , the transaction strategies, and, of course, the XML-based mapping metadata.

Usually, a single file named hibernate. None of this is much use without some persistent classes and their XML mapping documents.

The next chapter is dedicated to writing and mapping persistent classes. In this chapter, we start our discussion of the application by introducing a programming model for persistent classes. We create a conceptual model of these entities and their attributes, called a domain model. We implement this domain model in Java by creating a persistent class for each entity. We then define mapping metadata to tell Hibernate how these classes and their properties relate to database tables and columns.

This involves writing or generating XML documents that are eventually deployed along with the compiled Java classes and used by Hibernate at runtime. This discussion of mapping metadata is the core of this chapter, along with the in-depth exploration of the mapping techniques for fine-grained classes, object identity, inheritance, and associations. This chapter therefore provides the beginnings of a solution to the first four generic problems of ORM listed in section 1.

The application will have a web-based user interface and run inside a servlet engine like Tomcat. In chapter 8, we discuss the changes that would be necessary if we were to perform all business logic and data access from a separate business-tier implemented as EJB session beans. Our first task would be analysis.

Envers - Hibernate ORM

At this stage, you, with the help of problem domain experts, identify the main entities that are relevant to the software system. Entities are usually notions understood by users of the system: Payment, Customer, Order, Item, Bid, and so forth. Some entities might be abstractions of less concrete things the user thinks about for example, PricingAlgorithm , but even these would usually be understandable to the user.

All these entities are found in the conceptual view of the business, which we sometimes call a business model. Developers of object-oriented software analyze the business model and create an object model, still at the conceptual level no Java code. This object model may be as simple as a mental image existing only in the mind of the developer, or it may be as elaborate as a UML class diagram as in figure 3.

Category, Item, and User. The entities and their relationships and perhaps their attributes are all represented by this model of the problem domain. We call this kind of model—an object-oriented model of entities from the problem domain, encompassing only those entities that are of interest to the user—a domain model.

We refer to this model when we implement our persistent Java classes. Users continue to place bids on an item until the bid period for that item expires, and the highest bidder wins. In any store, goods are categorized by type and grouped with similar goods into sections and onto shelves. Clearly, our auction catalog requires some kind of hierarchy of item categories.

A downloader may browse these categories or arbitrarily search by category and item attributes. Lists of items appear in the category browser and Category Figure 3.

Selecting an item from a list will take the downloader to an item detail view. An auction consists of a sequence of bids. One particular bid is the winning bid. User details include name, login, address, email address, and billing information.

Hibernate Tutorial

A web of trust is an essential feature of an online auction site. The web of trust allows users to build a reputation for trustworthiness or untrustworthiness. downloaders may create comments about sellers and vice versa , and the comments are visible to all other users.

A high-level overview of our domain model is shown in figure 3.

Instead, we have a single auction item entity named Item. Thus, Bid is associated directly with Item. Users can write Comments about other users only in the context of an auction; hence the association between Item and Comment.

The Address information of a User is modeled as a separate class, even though the User may have only one Address. We do allow the user to have multiple BillingDetails.

The various billing strategies are represented as subclasses of an abstract class allowing future extension. A Category might be nested inside another Category.

This is expressed by a recursive association, from the Category entity to itself. Note that a single Category may have multiple child categories but at most one parent category. Each Item belongs to at least one Category. The entities in a domain model should encapsulate state and behavior. For example, the User entity should define the name and address of a customer and the logic required to calculate the shipping costs for items to this particular customer. Our domain model is a rich object model, with complex associations, interactions, and inheritance relationships.

An interesting and detailed discussion of object-oriented techniques for working with domain models can be found in Patterns of Enterprise Application Architecture [Fowler ] or in Domain-Driven Design [Evans ]. This is certainly not because we consider this an unimportant concern; rather, this concern is mostly orthogonal to the problem of persistence.

So, we concentrate our discussion on how to best represent state in our domain model, not on how to represent behavior. We stress that object persistence with full ORM is most suitable for applications based on a rich domain model. Many simple and some not-so-simple problems are perfectly suited to table-oriented solutions, where the application is designed around the database data model instead of around an object-oriented domain model, often with logic executed in the database stored procedures.

Now that we have a domain model, our next step is to implement it in Java. For instance, how do you separate the business concerns from the crosscutting concerns such as transactions and even persistence?

What kind of persistence is needed: Do you need automated or transparent persistence? Do you have to use a specific programming model to achieve this? In this section, we examine these types of issues and how to address them in a typical Hibernate application. This allows you to reuse the domain model implementation virtually anywhere.

Most importantly, it makes it easy to unit test the domain model in JUnit, for example outside of any application server or other managed environment.

However, there are other concerns, such as persistence, transaction management, and authorization. When these concerns start to appear in the domain model classes, we call this an example of leakage of concerns. The EJB standard tries to solve the problem of leaky concerns. Indeed, if we implemented our domain model using entity beans, the container would take care of some concerns for us or at least externalize those concerns to the deployment descriptor.

The EJB container prevents leakage of certain cross-cutting concerns using interception. The container intercepts calls to your beans and executes its own functionality.

For example, it might pass control to the CMP engine, which takes care of persistence. This approach allows the container to implement the predefined cross-cutting concerns—security, concurrency, persistence, transactions, and remoteness—in a generic way. Unfortunately, the EJB specification imposes many rules and restrictions on how you must implement a domain model. This in itself is a kind of leakage of concerns—in this case, the concerns of the container implementor have leaked!

Hibernate is a solution for just one of these concerns: Much discussion has gone into the topic of persistence, and both Hibernate and EJB entity beans take care of that concern.

So does Hibernate; indeed, Hibernate is a great deal more sophisticated in this respect.

First JBoss Seam tutorial

But Hibernate does this in a way that is transparent to your domain model. We use transparent to mean a complete separation of concerns between the persistent classes of the domain model and the persistence logic itself, where the persistent classes are unaware of—and have no dependency to—the persistence mechanism.

Nor are any special classes used to implement properties or associations. Testability is a basic requirement for applications with rich domain models.

Persistence concerns are externalized to a generic persistence manager interface —in the case of Hibernate, the Session and Query interfaces. Transparent persistence fosters a degree of portability; without special interfaces, the persistent classes are decoupled from any particular persistence solution. Our business logic is fully reusable in any other application context. We could easily change to another transparent persistence mechanism.

By this definition of transparent persistence, you see that certain non-automated persistence layers are transparent for example, the DAO pattern because they decouple the persistence-related code with abstract programming interfaces.

Only plain Java classes without dependencies are exposed to the business logic. Conversely, some automated persistence layers including entity beans and some ORM solutions are non-transparent, because they require special interfaces or intrusive programming models. We regard transparency as required. In fact, transparent persistence should be one of the primary goals of any ORM solution.

However, no automated persistence solution is completely transparent: Every automated persistence layer, including Hibernate, imposes some requirements on the persistent classes. For example, Hibernate requires that collection-valued properties be typed to an interface such as java.

Set or java. List and not to an actual implementation such as java. HashSet this is a good practice anyway. Do you need a special programming model at all? In theory, no; Licensed to Jose Carlos Romero Figueroa Implementing the domain model 67 in practice, you should adopt a disciplined, consistent programming model that is well accepted by the Java community. As a reaction against entity beans, many developers started talking about Plain Old Java Objects POJOs , a back-to-basics approach that essentially revives JavaBeans, a component model for UI development, and reapplies it to the business layer.

The few requirements that Hibernate imposes on your domain model are also best practices for the POJO programming model. A POJO declares business methods, which define behavior, and properties, which represent state.

Some properties represent associations to other POJOs. Listing 3. However, when objects are stored in an HttpSession or passed by value using RMI, serialization is necessary.

This is very likely to happen in a Hibernate application. C Unlike the JavaBeans specification, which requires no specific constructor, Hibernate requires a constructor with no arguments for every persistent class. Hibernate instantiates persistent classes using Constructor. The constructor may be non-public, but it should be at least package-visible if runtime-generated proxies will be used for performance optimization see chapter 4. Properties are usually implemented as instance variables, together with property accessor methods: These methods are known as the getter and setter, respectively.

Our example POJO declares getter and setter methods for the private username instance variable and also for address. The JavaBean specification defines the guidelines for naming these methods. The guidelines allow generic tools like Hibernate to easily discover and manipulate the property value. A getter method name begins with get, followed by the name of the property the first letter in uppercase ; a setter method name begins with set. Getter methods for Boolean properties may begin with is instead of get.

Some getter and setter methods do something more sophisticated than simple instance variables access validation, for example. Trivial accessor methods are common, however. E This POJO also defines a business method that calculates the cost of shipping an item to a particular user we left out the implementation of this method. String graph at runtime. The first association is shown in figure 3. Figure 3. These attributes and the methods that manipulate their values are called scaffolding code.

The parentCategory attribute implements the single-valued end of the association and is declared to be of type Category.

The many-valued end, implemented by the childCategories attribute, must be of collection type. We choose a Set, since duplicates are disallowed, and initialize the instance variable to a new instance of HashSet. Hibernate requires interfaces for collection-typed attributes. You must use java. Set rather than HashSet, for example. We now have some private instance variables but no public interface to allow access from business code or property management by Hibernate.


Copyright © 2019 nbafinals.info. All rights reserved.
DMCA |Contact Us