JPA with Hibernate - Sequence not working with XML - java

I'm using JPA with Hibernate for the first time and I try to set up automated ID generation using existing sequences from my Oracle database.
My entity mapping looks as follows:
<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
version="2.0">
<entity class="AmmAdapter.DataAccessLayer.Models.AmmSyncTypePriorities">
<table name="AMM_SYNC_TYPE_PRIORITIES" schema="TESTESTERON" catalog=""/>
<attributes>
<id name="id">
<column name="ID" nullable="false" length="10"/>
<generated-value strategy="SEQUENCE" generator="MODEL_SEQ"/>
<sequence-generator name="MODEL_SEQ" sequence-name="AMM_ED_GROUP_TYPES_SEQ"/>
</id>
<basic name="priority">
<column name="PRIORITY" nullable="false" length="10"/>
</basic>
<one-to-many name="ammSyncMessageTypesesById" mapped-by="ammSyncTypePrioritiesByPriority"
target-entity="AmmAdapter.DataAccessLayer.Models.AmmSyncMessageTypes"/>
</attributes>
</entity>
</entity-mappings>
My Java class looks as follows:
package AmmAdapter.DataAccessLayer.Models;
import java.util.Collection;
public class AmmEdGroupTypes
{
private Integer id;
public Integer getId()
{
return id;
}
public void setId(Integer id)
{
this.id = id;
}
private String name;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
#Override
public boolean equals(Object o)
{
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
AmmEdGroupTypes that = (AmmEdGroupTypes)o;
if (id != null ? !id.equals(that.id) : that.id != null) return false;
if (name != null ? !name.equals(that.name) : that.name != null) return false;
return true;
}
#Override
public int hashCode()
{
int result = id != null ? id.hashCode() : 0;
result = 31 * result + (name != null ? name.hashCode() : 0);
return result;
}
private Collection<AmmEndDeviceGroups> ammEndDeviceGroupsesById;
public Collection<AmmEndDeviceGroups> getAmmEndDeviceGroupsesById()
{
return ammEndDeviceGroupsesById;
}
public void setAmmEndDeviceGroupsesById(Collection<AmmEndDeviceGroups> ammEndDeviceGroupsesById)
{
this.ammEndDeviceGroupsesById = ammEndDeviceGroupsesById;
}
}
And my sequence AMM_ED_GROUP_TYPES_SEQ has:
Min value: 1
Max value: 9999999999999999999999999999
Increment by: 1
I use the following test code to determine if auto generation is working:
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("AdapterPersistence");
EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
AmmEdGroupTypes newGroup = new AmmEdGroupTypes();
newGroup.setName("test");
System.out.println(newGroup.getId());
And I get a null ID as result. Does someone know what the problem is?

EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
AmmEdGroupTypes newGroup = new AmmEdGroupTypes();
newGroup.setName("test");
entityManager.persist(newGroup);
entityManager.getTransaction().commit();
System.out.println(newGroup.getId());

Related

Composite key with one to many hibernate

I'm having a big problem trying to make this little program work
Here are my objects:
Class Country
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
public class Country implements Serializable {
private static final long serialVersionUID = 4947071545454L;
private String countryID;
private String countryName;
private Set<City> cities = new HashSet<City>();
public Country() {
}
public Country(String countryID, String countryName, Set<City> cities) {
this.countryID = countryID;
this.countryName = countryName;
this.cities = cities;
}
public static long getSerialVersionUID() {
return serialVersionUID;
}
public String getCountryID() {
return countryID;
}
public void setCountryID(String countryID) {
this.countryID = countryID;
}
public String getCountryName() {
return countryName;
}
public void setCountryName(String countryName) {
this.countryName = countryName;
}
public Set<City> getCities() {
return cities;
}
public void setCities(Set<City> cities) {
this.cities = cities;
}
#Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Country country = (Country) o;
return countryID != null ? countryID.equals(country.countryID) : country.countryID == null;
}
#Override
public int hashCode() {
return countryID != null ? countryID.hashCode() : 0;
}
public boolean addCity(City c){
return cities.add(c);
}
public boolean removeCity(City c){
return cities.remove(c);
}
}
Class City
import java.io.Serializable;
public class City implements Serializable{
private static final long serialVersionUID = 49470713545454L;
private String cityName;
private Country id;
public City(String cityName, Country id) {
this.cityName = cityName;
this.id = id;
}
public String getCityName() {
return cityName;
}
public void setCityName(String cityName) {
this.cityName = cityName;
}
public Country getId() {
return id;
}
public void setId(Country id) {
this.id = id;
}
#Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
City city = (City) o;
if (cityName != null ? !cityName.equals(city.cityName) : city.cityName != null) return false;
return id != null ? id.equals(city.id) : city.id == null;
}
#Override
public int hashCode() {
int result = cityName != null ? cityName.hashCode() : 0;
result = 31 * result + (id != null ? id.hashCode() : 0);
return result;
}
}
An here are my xml archives:
country.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.samuel.hibernate.Country" table="country" catalog="training2">
<id name="country" type="string" column="countryID">
<generator class="assign"/>
</id>
<property name="countryName" type="string">
<column name="countryName" length="40" not-null="true" unique="true" />
</property>
<set name="city" inverse="true" cascade="all">
<key column="countryID" not-null="true" />
<one-to-many class="com.samuel.hibernate.City"/>
</set>
</class>
</hibernate-mapping>
city.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.samuel.hibernate.City" table="city" catalog="training2">
<composite-id name="id">
<key-many-to-one name="countryID" class="com.samuel.hibernate.Country"
column="countryID" />
<key-property name="cityName" column="cityName" type="string"/>
</composite-id>
</class>
</hibernate-mapping>
And here's my main class:
Main class
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import java.util.HashSet;
import java.util.Set;
public class Main {
public static void main(String[] args) {
System.out.println("..");
Configuration cfg=new Configuration();
cfg.configure("hibernate.cfg.xml");
// aquí es donde peta si falla conexión con Postgres
//creating seession factory object
System.out.println("Antes de crear sesion");
SessionFactory factory=cfg.buildSessionFactory();
System.out.println("Despues de crear sesion");
//creating session object
Session session=factory.openSession();
//creating transaction object
Transaction t=session.beginTransaction();
Set<City> citiesSpain = new HashSet<>();
Country spain = new Country("es","Spain",citiesSpain);
citiesSpain.add(new City("Barcelona",spain));
citiesSpain.add(new City("Madrid",spain));
session.persist(spain);
t.commit();
session.close();
factory.close();
System.out.println("END");
}
}
When I execute this code I get this error message:
Exception in thread "main" org.hibernate.HibernateException: Unable to instantiate default tuplizer [org.hibernate.tuple.component.PojoComponentTuplizer]
at org.hibernate.tuple.component.ComponentTuplizerFactory.constructTuplizer(ComponentTuplizerFactory.java:98)
at org.hibernate.tuple.component.ComponentTuplizerFactory.constructDefaultTuplizer(ComponentTuplizerFactory.java:119)
at org.hibernate.tuple.component.ComponentMetamodel.<init>(ComponentMetamodel.java:68)
at org.hibernate.mapping.Component.getType(Component.java:169)
at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:422)
at org.hibernate.mapping.RootClass.validate(RootClass.java:266)
at org.hibernate.boot.internal.MetadataImpl.validate(MetadataImpl.java:329)
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:451)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:710)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:726)
at com.samuel.hibernate.Main.main(Main.java:22)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.hibernate.tuple.component.ComponentTuplizerFactory.constructTuplizer(ComponentTuplizerFactory.java:95)
... 10 more
Caused by: org.hibernate.PropertyNotFoundException: Could not locate getter method for property [com.samuel.hibernate.Country#cityName]
at org.hibernate.internal.util.ReflectHelper.findGetterMethod(ReflectHelper.java:418)
at org.hibernate.property.access.internal.PropertyAccessBasicImpl.<init>(PropertyAccessBasicImpl.java:41)
at org.hibernate.property.access.internal.PropertyAccessStrategyBasicImpl.buildPropertyAccess(PropertyAccessStrategyBasicImpl.java:27)
at org.hibernate.mapping.Property.getGetter(Property.java:308)
at org.hibernate.tuple.component.PojoComponentTuplizer.buildGetter(PojoComponentTuplizer.java:138)
at org.hibernate.tuple.component.AbstractComponentTuplizer.<init>(AbstractComponentTuplizer.java:47)
at org.hibernate.tuple.component.PojoComponentTuplizer.<init>(PojoComponentTuplizer.java:41)
... 15 more
I've tried looking online but I don't seem to find the solution. In my example, one country can have many cities, but one city can only have on country.
This error means that one or more setters/getters is missing. Make sure you define matching getters/setters for all your properties. And make sure that your properties annotated correctly.
I think that problem is that your cities set name is different in a class and in hbm.xml file. In your entity class you defined set as Set<City> cities and in your XML file you defined this property as name="city". So hibernate is searching setters and getters for city named property.
Make sure that variable and property name coincides. And add empty constructor in City.class.

org.hibernate.UnknownEntityTypeException: Unable to locate persister

I am going through some example of a hibernate book. But i am not able to load data based on entity name. below are the details
The entity class
#Entity
public class SimpleNaturalIdEmployee implements Serializable{
#Id
#GeneratedValue(strategy = GenerationType.AUTO)
Integer id;
#NaturalId
Integer badge;
String name;
public SimpleNaturalIdEmployee() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getBadge() {
return badge;
}
public void setBadge(Integer badge) {
this.badge = badge;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
#Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof SimpleNaturalIdEmployee)) return false;
SimpleNaturalIdEmployee that = (SimpleNaturalIdEmployee) o;
if (badge != null ? !badge.equals(that.badge) : that.badge != null) return false;
if (id != null ? !id.equals(that.id) : that.id != null) return false;
if (name != null ? !name.equals(that.name) : that.name != null) return false;
return true;
}
#Override
public int hashCode() {
int result = id != null ? id.hashCode() : 0;
result = 31 * result + (badge != null ? badge.hashCode() : 0);
result = 31 * result + (name != null ? name.hashCode() : 0);
return result;
}
}
my hibernate configuration file
<?xml version="1.0"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/rd?autoReconnect=true</property>
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- set up c3p0 for use -->
<property name="c3p0.max_size">10</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<!-- Drop and re-create the database schema on startup -->
<property name="hbm2ddl.auto">update</property>
<mapping class="chapter06.primarykey.after.Book"/>
<mapping class="chapter06.compoundpk.CPKBook"/>
<mapping class="chapter06.compoundpk.EmbeddedPKBook"/>
<mapping class="chapter06.compoundpk.IdClassBook"/>
<mapping class="chapter06.twotables.Customer"/>
<mapping class="chapter06.mappedsuperclass.ComputerBook"/>
<mapping class="chapter06.naturalid.Employee"/>
<mapping class="chapter06.naturalid.SimpleNaturalIdEmployee"/>
</session-factory>
</hibernate-configuration>
I using test class to run few scenario
#Test
public void testSimpleNaturalId() {
Integer id = 107;
try (Session session = getSession()) {
Transaction tx = session.beginTransaction();
SimpleNaturalIdEmployee employee =
session
.byId(SimpleNaturalIdEmployee.class)
.load(id);
assertNotNull(employee);
SimpleNaturalIdEmployee badgedEmployee =
session
.bySimpleNaturalId(SimpleNaturalIdEmployee.class)
.load(541011);
// assertEquals(badgedEmployee, employee);
SimpleNaturalIdEmployee badgedEmployee1 =
(SimpleNaturalIdEmployee) session.byId("SimpleNaturalIdEmployee").load(id);
tx.commit();
}
}
I am using hibernate 5 and i have tried all suggested way to creating a session but noting worked
Configuration configuration = new Configuration().configure();
StandardServiceRegistryBuilder builder = new
StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
ServiceRegistry registry = builder.build();
factory = configuration.addAnnotatedClass(SimpleNaturalIdEmployee.class).buildSessionFactory(registry);
return factory.openSession();
But still i get the below exception
org.hibernate.UnknownEntityTypeException: Unable to locate persister: SimpleNaturalIdEmployee
at org.hibernate.metamodel.internal.MetamodelImpl.locateEntityPersister(MetamodelImpl.java:647)
at org.hibernate.internal.SessionImpl.locateEntityPersister(SessionImpl.java:2946)
at org.hibernate.internal.SessionImpl.access$1700(SessionImpl.java:203)
at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.(SessionImpl.java:2689)
at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.(SessionImpl.java:2679)
at org.hibernate.internal.SessionImpl.byId(SessionImpl.java:1195)
I am trying to load using entity name Please help

session.save() have some mistake with "unknown entity "

I'm new to hibernate and as I researched. When i want to start my JUnit, this mistake could be occur every time. I guess something wrong with my hbm.xml file. Maybe I am missing something because I'm still new to hibernate.
This is my hbm.xml file.
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.test.UserEntity" table="user" schema="" catalog="junwa">
<id name="id" column="id"/>
<property name="username" column="username"/>
<property name="gender" column="gender"/>
<property name="birthday" column="birthday"/>
<property name="addres" column="addres"/>
</class>
</hibernate-mapping>
And this is my UserEntity.java file
package com.test;
import javax.persistence.*;
import java.sql.Timestamp;
#Entity
#Table(name = "user", schema = "", catalog = "junwa")
public class UserEntity {
private int id;
private String username;
private String gender;
private Timestamp birthday;
private String addres;
#Id
#Column(name = "id")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
#Basic
#Column(name = "username")
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
#Basic
#Column(name = "gender")
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
#Basic
#Column(name = "birthday")
public Timestamp getBirthday() {
return birthday;
}
public void setBirthday(Timestamp birthday) {
this.birthday = birthday;
}
#Basic
#Column(name = "addres")
public String getAddres() {
return addres;
}
public void setAddres(String addres) {
this.addres = addres;
}
#Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
UserEntity that = (UserEntity) o;
if (id != that.id) return false;
if (username != null ? !username.equals(that.username) : that.username != null) return false;
if (gender != null ? !gender.equals(that.gender) : that.gender != null) return false;
if (birthday != null ? !birthday.equals(that.birthday) : that.birthday != null) return false;
if (addres != null ? !addres.equals(that.addres) : that.addres != null) return false;
return true;
}
#Override
public int hashCode() {
int result = id;
result = 31 * result + (username != null ? username.hashCode() : 0);
result = 31 * result + (gender != null ? gender.hashCode() : 0);
result = 31 * result + (birthday != null ? birthday.hashCode() : 0);
result = 31 * result + (addres != null ? addres.hashCode() : 0);
return result;
}
}
This is my test file.
/**
* Created by junwa on 2017/4/2.
*/
import com.test.Students;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.Date;
public class StudentsTest {
private SessionFactory sessionFactory;
private Session session;
private Transaction transaction;
#Before
public void init(){
// create a deploy object
Configuration config = new Configuration().configure();
// create a service licenced object
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
// create a session factory object
sessionFactory = config.buildSessionFactory(serviceRegistry);
// create a sessoin object
session = sessionFactory.openSession();
// start transaction
transaction = session.beginTransaction();
}
#After
public void destroy(){
// commit transaction
transaction.commit();
// close session
session.close();
// close session factory
sessionFactory.close();
}
#Test
public void testSaveStudents(){
// create a object
Students s = new Students(1,"junwa","male",new Date(),"Anhui");
// save object to mysql database
session.save(s);
session.flush();
}
}
This my output
enter image description here
As Faraz Durrani said when you already have done the mapping in hbm.xml file, why do you need annotations for? Or the vice versa.You have to remove one of them. I would say remove hbm.xml file and use Annotations only.
One more thing I have noticed that you are not closing the transection also.
You can't use hbm.xml and annotation at the same time.

Hibernate create too much java classes

I generate java classes from db with hibernate. In configuration i set to generate:
And get 3 files from each table. For example:
Address.java
package gen;
// Generated 16.08.2012 12:47:01 by Hibernate Tools 3.4.0.CR1
/**
* Address generated by hbm2java
*/
public class Address implements java.io.Serializable
{
private AddressId id;
public Address()
{
}
public Address(AddressId id)
{
this.id = id;
}
public AddressId getId()
{
return this.id;
}
public void setId(AddressId id)
{
this.id = id;
}
}
AddressId.java
package gen;
// Generated 16.08.2012 12:47:01 by Hibernate Tools 3.4.0.CR1
/**
* AddressId generated by hbm2java
*/
public class AddressId implements java.io.Serializable
{
private String codeOkato;
private String codeKladr;
private String postalCode;
private String region;
private String house;
private String building;
private String structure;
private String apartment;
private String note;
public AddressId()
{
}
public AddressId(String codeOkato, String codeKladr, String postalCode, String region, String house, String building,
String structure, String apartment, String note)
{
this.codeOkato = codeOkato;
this.codeKladr = codeKladr;
this.postalCode = postalCode;
this.region = region;
this.house = house;
this.building = building;
this.structure = structure;
this.apartment = apartment;
this.note = note;
}
public String getCodeOkato()
{
return this.codeOkato;
}
public void setCodeOkato(String codeOkato)
{
this.codeOkato = codeOkato;
}
public String getCodeKladr()
{
return this.codeKladr;
}
public void setCodeKladr(String codeKladr)
{
this.codeKladr = codeKladr;
}
public String getPostalCode()
{
return this.postalCode;
}
public void setPostalCode(String postalCode)
{
this.postalCode = postalCode;
}
public String getRegion()
{
return this.region;
}
public void setRegion(String region)
{
this.region = region;
}
public String getHouse()
{
return this.house;
}
public void setHouse(String house)
{
this.house = house;
}
public String getBuilding()
{
return this.building;
}
public void setBuilding(String building)
{
this.building = building;
}
public String getStructure()
{
return this.structure;
}
public void setStructure(String structure)
{
this.structure = structure;
}
public String getApartment()
{
return this.apartment;
}
public void setApartment(String apartment)
{
this.apartment = apartment;
}
public String getNote()
{
return this.note;
}
public void setNote(String note)
{
this.note = note;
}
public boolean equals(Object other)
{
if ((this == other))
return true;
if ((other == null))
return false;
if (!(other instanceof AddressId))
return false;
AddressId castOther = (AddressId) other;
return ((this.getCodeOkato() == castOther.getCodeOkato()) || (this.getCodeOkato() != null
&& castOther.getCodeOkato() != null && this.getCodeOkato().equals(castOther.getCodeOkato())))
&& ((this.getCodeKladr() == castOther.getCodeKladr()) || (this.getCodeKladr() != null
&& castOther.getCodeKladr() != null && this.getCodeKladr().equals(castOther.getCodeKladr())))
&& ((this.getPostalCode() == castOther.getPostalCode()) || (this.getPostalCode() != null
&& castOther.getPostalCode() != null && this.getPostalCode().equals(castOther.getPostalCode())))
&& ((this.getRegion() == castOther.getRegion()) || (this.getRegion() != null && castOther.getRegion() != null && this
.getRegion().equals(castOther.getRegion())))
&& ((this.getHouse() == castOther.getHouse()) || (this.getHouse() != null && castOther.getHouse() != null && this
.getHouse().equals(castOther.getHouse())))
&& ((this.getBuilding() == castOther.getBuilding()) || (this.getBuilding() != null
&& castOther.getBuilding() != null && this.getBuilding().equals(castOther.getBuilding())))
&& ((this.getStructure() == castOther.getStructure()) || (this.getStructure() != null
&& castOther.getStructure() != null && this.getStructure().equals(castOther.getStructure())))
&& ((this.getApartment() == castOther.getApartment()) || (this.getApartment() != null
&& castOther.getApartment() != null && this.getApartment().equals(castOther.getApartment())))
&& ((this.getNote() == castOther.getNote()) || (this.getNote() != null && castOther.getNote() != null && this
.getNote().equals(castOther.getNote())));
}
public int hashCode()
{
int result = 17;
result = 37 * result + (getCodeOkato() == null ? 0 : this.getCodeOkato().hashCode());
result = 37 * result + (getCodeKladr() == null ? 0 : this.getCodeKladr().hashCode());
result = 37 * result + (getPostalCode() == null ? 0 : this.getPostalCode().hashCode());
result = 37 * result + (getRegion() == null ? 0 : this.getRegion().hashCode());
result = 37 * result + (getHouse() == null ? 0 : this.getHouse().hashCode());
result = 37 * result + (getBuilding() == null ? 0 : this.getBuilding().hashCode());
result = 37 * result + (getStructure() == null ? 0 : this.getStructure().hashCode());
result = 37 * result + (getApartment() == null ? 0 : this.getApartment().hashCode());
result = 37 * result + (getNote() == null ? 0 : this.getNote().hashCode());
return result;
}
}
Address.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 16.08.2012 12:47:01 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="gen.Address" table="address">
<composite-id name="id" class="gen.AddressId">
<key-property name="codeOkato" type="string">
<column name="code_okato" length="11" />
</key-property>
<key-property name="codeKladr" type="string">
<column name="code_kladr" length="20" />
</key-property>
<key-property name="postalCode" type="string">
<column name="postal_code" length="6" />
</key-property>
<key-property name="region" type="string">
<column name="region" />
</key-property>
<key-property name="house" type="string">
<column name="house" />
</key-property>
<key-property name="building" type="string">
<column name="building" />
</key-property>
<key-property name="structure" type="string">
<column name="structure" />
</key-property>
<key-property name="apartment" type="string">
<column name="apartment" />
</key-property>
<key-property name="note" type="string">
<column name="note" length="1500" />
</key-property>
</composite-id>
</class>
</hibernate-mapping>
How you can see in mapping file uses class Address.java. But with this class i cant set or get any parametrs like apartment or building. There only in AddressId class.
I all examples with hibernate what i see uses only one java class. What function of second class which hibernate fenerate.
So i wanna do all correct. And how i gonna generate java classes or use what i generete to waork with xml files and data base?
And another question how to create annotations in cenerated java classes autometiclly?
To generate annotations instead of hbm.xml, you should uncheck Hibernate XML mappings(.hbm.xml) and choose Generate EJB3 annotations.
Hibernate generates separate class for ID when table's primary key consists of multiple columns. It also does so when table does not have primary key at all.

Hibernate mapping issue with composite-id

I am using hibernate3 in my java app to access sqlserver 2008 enterprise.
The hibernate mapping uses composite id and when i try to load model it returns null. I spent days to resolve it but still no result. Composite id mapping should be used for multiple field based PK, but in my table no such PK, i wonder why the JBoss Hibernate Tool(eclipse plugin) generated it with composite id mapping ?
I would appreciate any help or comments.
Hibernate Models:
public class AuthorLoginTrack implements java.io.Serializable {
private AuthorLoginTrackId id;
public AuthorLoginTrack() {
}
public AuthorLoginTrack(AuthorLoginTrackId id) {
this.id = id;
}
public AuthorLoginTrackId getId() {
return this.id;
}
public void setId(AuthorLoginTrackId id) {
this.id = id;
}
}
public class AuthorLoginTrackId implements java.io.Serializable {
private long id;
private String userId;
private Date dateCreated;
public AuthorLoginTrackId() {
}
public AuthorLoginTrackId(long id, String userId) {
this.id = id;
this.userId = userId;
}
public AuthorLoginTrackId(long id, String userId, Date dateCreated) {
this.id = id;
this.userId = userId;
this.dateCreated = dateCreated;
}
public long getId() {
return this.id;
}
public void setId(long id) {
this.id = id;
}
public String getUserId() {
return this.userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public Date getDateCreated() {
return this.dateCreated;
}
public void setDateCreated(Date dateCreated) {
this.dateCreated = dateCreated;
}
public boolean equals(Object other) {
if ((this == other))
return true;
if ((other == null))
return false;
if (!(other instanceof AuthorLoginTrackId))
return false;
AuthorLoginTrackId castOther = (AuthorLoginTrackId) other;
return (this.getId() == castOther.getId())
&& ((this.getUserId() == castOther.getUserId()) || (this
.getUserId() != null
&& castOther.getUserId() != null && this.getUserId()
.equals(castOther.getUserId())))
&& ((this.getDateCreated() == castOther.getDateCreated()) || (this
.getDateCreated() != null
&& castOther.getDateCreated() != null && this
.getDateCreated().equals(castOther.getDateCreated())));
}
public int hashCode() {
int result = 17;
result = 37 * result + (int) this.getId();
result = 37 * result
+ (getUserId() == null ? 0 : this.getUserId().hashCode());
result = 37
* result
+ (getDateCreated() == null ? 0 : this.getDateCreated()
.hashCode());
return result;
}
}
Hibernate Mapping:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated Apr 6, 2010 4:17:46 PM by Hibernate Tools 3.3.0.GA -->
<hibernate-mapping>
<class name="com.entity.model.AuthorLoginTrack" table="AuthorLoginTrack" schema="dbo" catalog="tribetoyota_db">
<composite-id name="id" class="com.entity.model.AuthorLoginTrackId">
<key-property name="id" type="long">
<column name="ID" precision="18" scale="0" />
</key-property>
<key-property name="userId" type="string">
<column name="UserID" length="20" />
</key-property>
<key-property name="dateCreated" type="timestamp">
<column name="DateCreated" length="16" />
</key-property>
</composite-id>
</class>
</hibernate-mapping>
Table Dump:
/****** Object: Table [dbo].[AuthorLoginTrack] Script Date: 04/14/2010 20:43:02 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[AuthorLoginTrack](
[ID] [numeric](18, 0) IDENTITY(1,1) NOT NULL,
[UserID] [varchar](20) NOT NULL,
[DateCreated] [smalldatetime] NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[AuthorLoginTrack] ADD CONSTRAINT [DF_AuthorLoginTrack_DateCreated] DEFAULT (getdate()) FOR [DateCreated]
GO
Table:
ID UserID DateCreated
------------------------------------
5 cooler 2005-03-17 18:56:00
6 miumiu 2005-03-17 19:46:00
DAO Code:
AuthorLoginTrack track;
AuthorLoginTrackId trackId;
trackId = new AuthorLoginTrackId();
trackId.setId(5);
track = (AuthorLoginTrack)getSession().load(AuthorLoginTrack.class, trackId);
return track.getId().getUserId(); // returns null why ?:((
Session.load(...) assumes that there's indeed an instance with the given id, most of the time it will return a proxy object without hitting the database. What you're really querying is an instance with id 5, userId = null and date == null.
Basically you're getting an unitialized proxy with a copy of the composite id you used to query it. If the instance really exists you'll be fine, otherwise you'll get an ObjectNotFoundException the first time you'll try to use the object.

Categories