Hi Friends,
Recently I was trying to do something different. I could not find exact solution what I was looking for. Thus sharing here. Some one else might be benefited by this.
Now I will get straight to the point. First the problem statement:
I have a Java class like this
import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.apache.log4j.Logger;
/**
* @author: Aniruddha Dutta Chowdhury
*
*/
public class HibernateDemo implements Serializable {
private static Logger logger = Logger.getLogger(HibernateDemo.class);
private Map requestData = new HashMap();
private Map contextData = new HashMap();
private Map responsetData = new HashMap();
private Date timeOfAction = null;
private Long id = null;
public Map getResponsetData() {
return responsetData;
}
public void setResponsetData(Map responsetData) {
this.responsetData = responsetData;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Date getTimeOfAction() {
return timeOfAction;
}
public void setTimeOfAction(Date timeOfAction) {
this.timeOfAction = timeOfAction;
}
public Map getRequestData() {
return requestData;
}
public void setRequestData(Map requestData) {
this.requestData = requestData;
}
public Map getContextData() {
return contextData;
}
public void setContextData(Map contextData) {
this.contextData = contextData;
}
public Map getResponseData() {
return responseData;
}
public void setResponseData(Map responseData) {
this.responseData = responseData;
}
private Map responseData = new HashMap();
}
And I wanted only two tables for this whole class. One for the main class and another one for all the map members.
Desired tables are as follows:
AND the child table would be
Now this is not a big deal for hibernate. Using the where clause. But the question comes that how to fill the value for discriminator. Then after going through hibernate api I came up with this. The SQL-INSERT is really very handy in this case.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<class name="HibernateDemo" table="MAIN_TABLE">
<id name="id">
<generator class="native" />
</id>
<property name="timeOfAction" />
<map name="requestData" table="CHILD_TABLE" where="DISCRIMENATOR='REQUEST'">
<key column="PARENT_ID" />
<index column="KEY" type="string" />
<element column="VALUE" type="string" />
<sql-insert>insert into CHILD_TABLE (PARENT_ID, KEY, VALUE, DISCRIMENATOR) values (?, ?, ?, 'REQUEST')</sql-insert>
</map>
<map name="contextData" table="CHILD_TABLE" where="DISCRIMENATOR='CONTEXT'">
<key column="PARENT_ID" />
<index column="KEY" type="string" />
<element column="VALUE" type="string" />
<sql-insert>insert into CHILD_TABLE (PARENT_ID, KEY, VALUE, DISCRIMENATOR) values (?, ?, ?, 'CONTEXT')</sql-insert>
</map>
<map name="responsetData" table="CHILD_TABLE" where="DISCRIMENATOR='RESPONSE'">
<key column="PARENT_ID" />
<index column="KEY" type="string" />
<element column="VALUE" type="string" />
<sql-insert>insert into CHILD_TABLE (PARENT_ID, KEY, VALUE, DISCRIMENATOR) values (?, ?, ?, 'RESPONSE')</sql-insert>
</map>
</class>
</hibernate-mapping>
Hope this will help you. Till next time, BYE.
Recently I was trying to do something different. I could not find exact solution what I was looking for. Thus sharing here. Some one else might be benefited by this.
Now I will get straight to the point. First the problem statement:
I have a Java class like this
import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.apache.log4j.Logger;
/**
* @author: Aniruddha Dutta Chowdhury
*
*/
public class HibernateDemo implements Serializable {
private static Logger logger = Logger.getLogger(HibernateDemo.class);
private Map
private Map
private Map
private Date timeOfAction = null;
private Long id = null;
public Map
return responsetData;
}
public void setResponsetData(Map
this.responsetData = responsetData;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Date getTimeOfAction() {
return timeOfAction;
}
public void setTimeOfAction(Date timeOfAction) {
this.timeOfAction = timeOfAction;
}
public Map
return requestData;
}
public void setRequestData(Map
this.requestData = requestData;
}
public Map
return contextData;
}
public void setContextData(Map
this.contextData = contextData;
}
public Map
return responseData;
}
public void setResponseData(Map
this.responseData = responseData;
}
private Map
}
And I wanted only two tables for this whole class. One for the main class and another one for all the map members.
Desired tables are as follows:
MAIN_TABLE | |
ID | PK |
ACTION_TIME |
AND the child table would be
CHILD_TABLE | |
PARENT_ID | FK |
KEY | |
VALUE | |
DISCRIMINATOR |
Now this is not a big deal for hibernate. Using the where clause. But the question comes that how to fill the value for discriminator. Then after going through hibernate api I came up with this. The SQL-INSERT is really very handy in this case.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<class name="HibernateDemo" table="MAIN_TABLE">
<id name="id">
<generator class="native" />
</id>
<property name="timeOfAction" />
<map name="requestData" table="CHILD_TABLE" where="DISCRIMENATOR='REQUEST'">
<key column="PARENT_ID" />
<index column="KEY" type="string" />
<element column="VALUE" type="string" />
<sql-insert>insert into CHILD_TABLE (PARENT_ID, KEY, VALUE, DISCRIMENATOR) values (?, ?, ?, 'REQUEST')</sql-insert>
</map>
<map name="contextData" table="CHILD_TABLE" where="DISCRIMENATOR='CONTEXT'">
<key column="PARENT_ID" />
<index column="KEY" type="string" />
<element column="VALUE" type="string" />
<sql-insert>insert into CHILD_TABLE (PARENT_ID, KEY, VALUE, DISCRIMENATOR) values (?, ?, ?, 'CONTEXT')</sql-insert>
</map>
<map name="responsetData" table="CHILD_TABLE" where="DISCRIMENATOR='RESPONSE'">
<key column="PARENT_ID" />
<index column="KEY" type="string" />
<element column="VALUE" type="string" />
<sql-insert>insert into CHILD_TABLE (PARENT_ID, KEY, VALUE, DISCRIMENATOR) values (?, ?, ?, 'RESPONSE')</sql-insert>
</map>
</class>
</hibernate-mapping>
Hope this will help you. Till next time, BYE.