Wednesday, December 8, 2010

Hibernate-Secondary Table Annotation..

When using Hibernate with annotation, SecondaryTable needs to be used carefully while using the Discriminator. We assume that there is a table called Inventory which is the parent table that has common elements including Id, createDate, modifiedDate, SKU#, and productType.
The other tables, which are children of the Inventory table, are TV_Inventory, DVD_inventory etc.. In this example, we consider TV_Inventory which inherits from Inventory (in terms of objects).

@Entity
@Table(name = "INVENTORY")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "PRODUCT_TYPE", discriminatorType = DiscriminatorType.STRING, length = 20)
@SequenceGenerator(name = "InventorySequence", sequenceName = "INV_SEQ", allocationSize = 1)



public abstract class Inventory {
 // getters and setters with other annotations for the columns and relevant methods.
}
 
Consider the child object associated with the table TV_INVENTORY. The outline is shown below:
 
@Entity
@DiscriminatorValue("TV")

@SecondaryTable(name = "TV_INVENTORY")

public class TVInventory extends Inventory {
              private Location loc;      //LOCATION Table entity
           // Other relevant columns, getters setters and methods.
}


In using the above definition and annotations, we will get the following error (assuming we are using Oracle DB):

SELECT
<<<< columns from Entities >>>
from
TV_Inventory invento0_,
INVENTORY ainvento0_1_,
LOCATION inventoryl2_
where
invento0_.LOCATION_SEQ=inventoryl2_.LOCATION_SEQ(+)
and ainvento0_.INVENTORY_ID=ainvento0_1_.INVENTORY_ID
and ainvento0_.INVENTORY_ID=?

[10:55:46:218] org.hibernate.jdbc.AbstractBatcher DEBUG about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
[10:55:46:218] org.hibernate.util.JDBCExceptionReporter DEBUG could not load an entity: [com.hibernate.inv.model.aInventory#365746]
[The generated hibernate QUERY......]
java.sql.SQLException: ORA-00942: table or view does not exist
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:743)


This can be fixed by NOT using SecondaryTable. So now the TVInventory class is re-defined as:

@Entity
@DiscriminatorValue("TV")
@Table(name="TV_INVENTORY")
public class TVInventory extends Inventory {

            private Location loc; //LOCATION Table entity

}

...and it works fine without errors. Now assume that for each TV in our inventory we have features of TV stored in another table, say TV_FEATURES. Then we can use the SecondaryTable annotation as follows:

@Entity

@DiscriminatorValue("TV")
@Table(name="TV_INVENTORY")
@SecondaryTable(name="TV_FEATURES")
public class TVInventory extends Inventory {
                   @OneToMany(fetch = FetchType.EAGER)
                  @JoinColumn(name="INVENTORY_ID")
                   private List tvFeatures;  
}
 
The TVFeature class is defined below:
 
@Entity
@Table(name="TV_FEATURES")
public class TVFeature {
       ///getters and setters for columns
}
 
In the above scenarios, we are not using any inheritance. Instead we are joining the tables together on the inventory_id and defining the relationship between the TVInventory and TVFeature objects. Therefore when using inheritance, SecondaryTable codes can get a little complex in Hibernate.

Saturday, April 3, 2010

Binary Digits.

Consider the number 783 which can be obtained by:
7 x 102=700
8 x 101= 80
3 x 100= 3
78310 Total= 78310

In the decimal system, we are counting how many 10s, 100s, 1000s, 10000s etc. there are. Then we are multiplying the number depending on where it is positioned, and finally, we add them up.

If we were to do the same to the 8th base, then the above table will look as follows:

1 x 83=512
4 x 82=216
6 x 81=48
7 x 80=7
14678 Total= 78310

Now the number 78310 ~= 14678. This means that any number (like 783) can be written to any number base; even its own. So in computers we are interested in binary digits, as the switches in circuits are either ON or OFF. With this in mind, the number above (783) would be written in binary form as follows:


1 x 29=512
1 x 28=256
0 x27=0
0 x 26=0
0 x 25=0
0 x 24=0
1 x23=8
1 x22=4
1 x21=2
1 x 20=1
11000011112 Total= 78310


This means that:
11000011112 ~=78310

Here is a sequence that may simplify this process a bit better:

20 = 1 = 12
21 = 2 = 102
22 = 4 = 1002
23 = 8 = 10002
24 = 16 = 100002
25 = 32 = 1000002
26 = 64 = 10000002
24 = 128 = 100000002
and so on...

So now, gifting somebody $32.00 in decimal form will be written in binary as $100,0002 and giving $64.00 = $1,000,0002 which is a LOT OF MONEY... :).

As the joke goes: There are 10 kinds of people, the kind that understand binary numbers and those who do not.

Sunday, January 10, 2010

4 Circles releases Word Frequency..


4 Circles released its application 'Word Frequency v1.1'.

This application counts the number of words in your essay and tells you the frequency of each word. This application is simple to use and helpful for bloggers, writers, journalists, students and speech writers. The application has 1 box for the text to be copied and pasted (left hand side) while clicking the button will count the total number of words in the essay.

This application is written in JDK 1.6, and runs on JRE 1.6.x or above. The user needs to copy the text and place it in the text box and click on the button to get the frequency in the grid. Please download the software here:
Word Frequency