java - Hibernate: OneToMany relationship WITHOUTH cyclic dependency -
i have onetomany
data model 2 entities. 1 machine contains many characteristics.
problem: trying create entities without cyclic dependency.
but issue:
exception sending context initialized event listener instance of class org.springframework.web.context.contextloaderlistener org.springframework.beans.factory.beancreationexception: error creating bean name 'entitymanagerfactory' defined in servletcontext resource [/web-inf/spring-config.xml]: invocation of init method failed; nested exception javax.persistence.persistenceexception: [persistenceunit: default] unable build hibernate sessionfactory @ org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.initializebean(abstractautowirecapablebeanfactory.java:1574) @ org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.docreatebean(abstractautowirecapablebeanfactory.java:539) @ org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.createbean(abstractautowirecapablebeanfactory.java:476) @ org.springframework.beans.factory.support.abstractbeanfactory$1.getobject(abstractbeanfactory.java:303) @ org.springframework.beans.factory.support.defaultsingletonbeanregistry.getsingleton(defaultsingletonbeanregistry.java:230) @ org.springframework.beans.factory.support.abstractbeanfactory.dogetbean(abstractbeanfactory.java:299) @ org.springframework.beans.factory.support.abstractbeanfactory.getbean(abstractbeanfactory.java:194) @ org.springframework.context.support.abstractapplicationcontext.getbean(abstractapplicationcontext.java:956) @ org.springframework.context.support.abstractapplicationcontext.finishbeanfactoryinitialization(abstractapplicationcontext.java:747) @ org.springframework.context.support.abstractapplicationcontext.refresh(abstractapplicationcontext.java:480) @ org.springframework.web.context.contextloader.configureandrefreshwebapplicationcontext(contextloader.java:403) @ org.springframework.web.context.contextloader.initwebapplicationcontext(contextloader.java:306) @ org.springframework.web.context.contextloaderlistener.contextinitialized(contextloaderlistener.java:106) @ org.apache.catalina.core.standardcontext.listenerstart(standardcontext.java:4842) @ org.apache.catalina.core.standardcontext.startinternal(standardcontext.java:5303) @ org.apache.catalina.util.lifecyclebase.start(lifecyclebase.java:147) @ org.apache.catalina.core.containerbase$startchild.call(containerbase.java:1407) @ org.apache.catalina.core.containerbase$startchild.call(containerbase.java:1397) @ java.util.concurrent.futuretask.run(unknown source) @ java.util.concurrent.threadpoolexecutor.runworker(unknown source) @ java.util.concurrent.threadpoolexecutor$worker.run(unknown source) @ java.lang.thread.run(unknown source) caused by: javax.persistence.persistenceexception: [persistenceunit: default] unable build hibernate sessionfactory @ org.hibernate.jpa.boot.internal.entitymanagerfactorybuilderimpl.persistenceexception(entitymanagerfactorybuilderimpl.java:1225) @ org.hibernate.jpa.boot.internal.entitymanagerfactorybuilderimpl.access$600(entitymanagerfactorybuilderimpl.java:119) @ org.hibernate.jpa.boot.internal.entitymanagerfactorybuilderimpl$4.perform(entitymanagerfactorybuilderimpl.java:853) @ org.hibernate.jpa.boot.internal.entitymanagerfactorybuilderimpl$4.perform(entitymanagerfactorybuilderimpl.java:843) @ org.hibernate.boot.registry.classloading.internal.classloaderserviceimpl.withtccl(classloaderserviceimpl.java:398) @ org.hibernate.jpa.boot.internal.entitymanagerfactorybuilderimpl.build(entitymanagerfactorybuilderimpl.java:842) @ org.springframework.orm.jpa.vendor.springhibernatejpapersistenceprovider.createcontainerentitymanagerfactory(springhibernatejpapersistenceprovider.java:60) @ org.springframework.orm.jpa.localcontainerentitymanagerfactorybean.createnativeentitymanagerfactory(localcontainerentitymanagerfactorybean.java:343) @ org.springframework.orm.jpa.abstractentitymanagerfactorybean.afterpropertiesset(abstractentitymanagerfactorybean.java:318) @ org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.invokeinitmethods(abstractautowirecapablebeanfactory.java:1633) @ org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.initializebean(abstractautowirecapablebeanfactory.java:1570) ... 21 more caused by: org.hibernate.mappingexception: not determine type for: java.util.set, @ table: machine, columns: [org.hibernate.mapping.column(characteristics)] @ org.hibernate.mapping.simplevalue.gettype(simplevalue.java:336) @ org.hibernate.mapping.simplevalue.isvalid(simplevalue.java:310) @ org.hibernate.mapping.property.isvalid(property.java:241) @ org.hibernate.mapping.persistentclass.validate(persistentclass.java:496) @ org.hibernate.mapping.rootclass.validate(rootclass.java:270) @ org.hibernate.cfg.configuration.validate(configuration.java:1358) @ org.hibernate.cfg.configuration.buildsessionfactory(configuration.java:1849) @ org.hibernate.jpa.boot.internal.entitymanagerfactorybuilderimpl$4.perform(entitymanagerfactorybuilderimpl.java:850) ... 29 more
my database:
machine:
create statement:
create table `machine` ( `id` int(11) not null auto_increment, `name` varchar(45) not null, `description` varchar(45) not null, primary key (`id`) ) engine=innodb auto_increment=31 default charset=utf8
entity:
@entity @table(name = "machine") public class machine { private int machine_id; private string name; private string description; private set<characteristic> characteristics; public set<characteristic> getcharacteristics() { return characteristics; } public void setcharacteristics(set<characteristic> characteristics){ this.characteristics = characteristics; } public machine(){} public machine(string name, string description){ this.name = name; this.description = description; } @id @generatedvalue(strategy = generationtype.auto) @column(name="id") public int getid() { return machine_id; } public void setid(int machine_id) { this.machine_id = machine_id; } @column(name="name") public string getname() { return name; } public void setname(string name) { this.name = name; } @column(name="description") public string getdescription() { return description; } public void setdescription(string description) { this.description = description; } }
characteristic
create statement:
create table `characteristic` ( `characteristic_id` int(11) not null auto_increment, `machine_id` int(11) not null default '0', `name` varchar(45) default null, `description` varchar(45) default null, `type` int(11) not null, `value` int(11) default null, primary key (`characteristic_id`), ) engine=innodb auto_increment=26 default charset=latin1
entity:
@entity @table(name = "characteristic") public class characteristic { private int characteristic_id; private string name; private string description; private int type; private int value; public characteristic() {} public characteristic(string description, int type, int value) { this.description = description; this.type = type; this.value = value; } public characteristic(int characteristic_id, string description, int type, int value) { this.characteristic_id = characteristic_id; this.description = description; this.type = type; this.value = value; } @id @generatedvalue(strategy = generationtype.auto) @column(name="characteristic_id") public int getcharacteristic_id() { return characteristic_id; } public void setcharacteristic_id(int characteristic_id) { this.characteristic_id = characteristic_id; } @column(name="name") public string getname() { return name; } public void setname(string name) { this.name = name; } @column(name="description") public string getdescription() { return description; } public void setdescription(string description) { this.description = description; } @column(name="type") public int gettype() { return type; } public void settype(int type) { this.type = type; } @column(name="value") public int getvalue() { return value; } public void setvalue(int value) { this.value = value; } }
spring-config.xml
<?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:context="http://www.springframework.org/schema/context" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <context:component-scan base-package="com.mego.smscloud" /> <bean id="datasource" class="org.springframework.jdbc.datasource.drivermanagerdatasource"> <property name="driverclassname" value="com.mysql.jdbc.driver"/> <property name="url" value="jdbc:mysql://localhost:3306/maschinedb?servertimezone=utc"/> <property name="username" value="root"/> <property name="password" value=""/> </bean> <bean id="jpavendoradapter" class="org.springframework.orm.jpa.vendor.hibernatejpavendoradapter"> <property name="showsql" value="true"/> <property name="generateddl" value="true"/> <property name="database" value="mysql"/> </bean> <bean id="entitymanagerfactory" class="org.springframework.orm.jpa.localcontainerentitymanagerfactorybean"> <property name="datasource" ref="datasource"/> <property name="jpavendoradapter" ref="jpavendoradapter"/> <property name="packagestoscan" value="com.mego.smscloud.entity"/> </bean> <bean id="transactionmanager" class="org.springframework.orm.jpa.jpatransactionmanager"/> <jpa:repositories base-package="com.mego.smscloud.repository" /> </beans>
it's problem mapping between characteristic , machine. log tells hibernate doesn't know type use mapping. should add @onetomany annotation on method getcharacteristics() in class machine.
you have here collection mapping @ section onetomany unidirectional (with or without jointable): https://docs.jboss.org/hibernate/annotations/3.4/reference/en/html_single/#entity-mapping-association-collections
@entity @table(name = "machine") public class machine { private int machine_id; private string name; private string description; private set<characteristic> characteristics; @onetomany @joincolumn(name="machine_id") public set<characteristic> getcharacteristics() { return characteristics; } public void setcharacteristics(set<characteristic> characteristics){ this.characteristics = characteristics; } public machine(){} public machine(string name, string description){ this.name = name; this.description = description; } @id @generatedvalue(strategy = generationtype.auto) @column(name="id") public int getid() { return machine_id; } public void setid(int machine_id) { this.machine_id = machine_id; } @column(name="name") public string getname() { return name; } public void setname(string name) { this.name = name; } @column(name="description") public string getdescription() { return description; } public void setdescription(string description) { this.description = description; } }
hope help
Comments
Post a Comment