Java 具有一对多休眠的复合密钥
我有一个大问题,试图使这个小程序的工作 以下是我的物品: 阶级国家Java 具有一对多休眠的复合密钥,java,xml,hibernate,Java,Xml,Hibernate,我有一个大问题,试图使这个小程序的工作 以下是我的物品: 阶级国家 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 countr
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);
}
}
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;
}
}
下面是我的xml档案:
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>
<?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>
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.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>
<?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>
这是我的主要课程:
主类
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");
}
}
import org.hibernate.Session;
导入org.hibernate.SessionFactory;
导入org.hibernate.Transaction;
导入org.hibernate.cfg.Configuration;
导入java.util.HashSet;
导入java.util.Set;
公共班机{
公共静态void main(字符串[]args){
系统输出打印项次(“…”);
Configuration cfg=新配置();
configure(“hibernate.cfg.xml”);
//佩塔·斯法拉·康涅西翁学院学院
//创建seession工厂对象
系统输出打印(Antes de crear sesion);
SessionFactory=cfg.buildSessionFactory();
系统输出打印文件(“文件处理文件”);
//创建会话对象
Session Session=factory.openSession();
//创建事务对象
事务t=session.beginTransaction();
Set citiesSpain=new HashSet();
国家西班牙=新国家(“es”、“西班牙”、citiesSpain);
citiesSpain.add(新城市(“西班牙巴塞罗那”);
citiesSpain.add(新城市(“西班牙马德里”);
第二届会议(西班牙);
t、 提交();
session.close();
工厂关闭();
系统输出打印项次(“结束”);
}
}
当我执行此代码时,会收到以下错误消息:
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
线程“main”org.hibernate.HibernateException中的异常:无法实例化默认元组化程序[org.hibernate.tuple.component.pojocomponentuplezer]
位于org.hibernate.tuple.component.ComponentTuplizerFactory.ConstructionTuplizer(ComponentTuplizerFactory.java:98)
位于org.hibernate.tuple.component.ComponentTuplizerFactory.constructDefaultTuplizer(ComponentTuplizerFactory.java:119)
位于org.hibernate.tuple.component.ComponentMetamodel(ComponentMetamodel.java:68)
位于org.hibernate.mapping.Component.getType(Component.java:169)
位于org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:422)
位于org.hibernate.mapping.RootClass.validate(RootClass.java:266)
位于org.hibernate.boot.internal.MetadataImpl.validate(MetadataImpl.java:329)
位于org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:451)
位于org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:710)
位于org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:726)
位于com.samuel.hibernate.Main.Main(Main.java:22)
原因:java.lang.reflect.InvocationTargetException
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
位于java.lang.reflect.Constructor.newInstance(Constructor.java:423)
位于org.hibernate.tuple.component.ComponentTuplizerFactory.ConstructionTuplizer(ComponentTuplizerFactory.java:95)
... 10多
原因:org.hibernate.PropertyNotFoundException:找不到属性[com.samuel.hibernate.Country#cityName]的getter方法
位于org.hibernate.internal.util.ReflectHelper.FindGeterMethod(ReflectHelper.java:418)
位于org.hibernate.property.access.internal.PropertyAccessBasicImpl.(PropertyAccessBasicImpl.java:41)
位于org.hibernate.property.access.internal.PropertyAccessStrategyBasicImpl.buildPropertyAccess(PropertyAccessStrategyBasicImpl.java:27)
位于org.hibernate.mapping.Property.getGetter(Property.java:308)
位于org.hibernate.tuple.component.PojoComponentTuplizer.buildGetter(PojoComponentTuplizer.java:138)
位于org.hibernate.tuple.component.AbstractComponentTuplizer。(AbstractComponentTuplizer.java:47)
位于org.hibernate.tuple.component.PojoComponentTuplizer。(PojoComponentTuplizer.java:41)
... 还有15个
我试过上网,但似乎找不到解决办法。在我的示例中,一个国家可以有许多城市,但一个城市只能有一个国家。此错误意味着缺少一个或多个setter/getter。确保为所有属性定义匹配的getter/setter。并确保您的属性注释正确 我认为问题在于类和hbm.xml文件中的城市集名称不同。在实体类中,您将set定义为
set cities
,在XML文件中,您将此属性定义为name=“city”
。因此,hibernate正在搜索city
命名属性的setter和getter
确保变量名和属性名一致。并在
City.class
中添加空构造函数。此错误表示缺少一个或多个setter/getter。确保为所有属性定义匹配的getter/setter。并确保您的属性注释正确
我认为问题在于类和hbm.xml文件中的城市集名称不同。在实体类中,您将set定义为set cities
,在XML文件中,您将此属性定义为name=“city”
。因此,hibernate正在搜索city
命名属性的setter和getter
确保变量名和属性名一致。并在City.class
中添加空构造函数