【发布时间】:2015-04-30 17:56:34
【问题描述】:
我正在尝试为表 City 使用复合主键,如果它没有分配给 Country,则该表不应该存在(它应该是多对一 识别关系)。
我的问题首先是ChildId(参见嵌套类)在我初始化Child 之后有一个@GeneratedValue 即null,如下所示:
List<City> cityList = new ArrayList<>();
City graz = new City(austria, "Graz");
// Runs without exceptions but graz.getCityId().getId() will be 'null'
cityList.add(graz);
cityList.add(new City(austria, "Wien"));
似乎因为它我得到了一个org.hibernate.NonUniqueObjectException 异常:
完整的堆栈跟踪:
Exception in thread "main" org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.mahlzeit.datamodel.address.City#com.mahlzeit.datamodel.address.City$CityId@8a62f66]
at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:182)
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:138)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:204)
at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:189)
at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:642)
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:635)
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:631)
at com.mahlzeit.datamodel.HibernateTest.addAddressData(HibernateTest.java:63)
at com.mahlzeit.datamodel.HibernateTest.populateDatabase(HibernateTest.java:35)
at com.mahlzeit.datamodel.HibernateTest.main(HibernateTest.java:31)
我不知道我是否可以这样做。如果是,我怎样才能做到这一点?
City.java
@Entity
public class City implements Serializable {
private static final long serialVersionUID = -4374113410767348574L;
@EmbeddedId
private CityId cityId;
private String cityName;
public City(Country country, String cityName) {
setCityId(new CityId(country));
this.cityName = cityName;
}
public String getCityName() {
return cityName;
}
public void setCityName(String countryName) {
this.cityName = countryName;
}
public CityId getCityId() {
return cityId;
}
public void setCityId(CityId cityId) {
this.cityId = cityId;
}
@Embeddable
public static class CityId implements Serializable{
private static final long serialVersionUID = -8561021314776406519L;
@GeneratedValue
private Long id;
private Country country;
public CityId(Country country) {
this.setCountry(country);
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Country getCountry() {
return country;
}
public void setCountry(Country country) {
this.country = country;
}
}
}
Country.java
@Entity
public class Country implements Serializable {
private static final long serialVersionUID = -2060021861139912774L;
@Id
@GeneratedValue
private Long id;
@Column(unique=true)
private String countryCode;
public Country(String country_code) {
this.countryCode = country_code;
}
public String getCountryCode() {
return countryCode;
}
public void setCountryCode(String countryCode) {
this.countryCode = countryCode;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
【问题讨论】:
标签: hibernate