我使用MySQL 5.5.37,JPA 2.0和Hibernate 4.1.0.Final(如果它解决了我的问题,我愿意升级)。我有以下实体...如何在@ElementCollection是java.util.Map时自动生成ID?
@Entity
@Table(name = "url")
public class Url implements Serializable
{
…
@ElementCollection(fetch=FetchType.EAGER)
@MapKeyColumn(name="property_name")
@Column(name="property_value")
@CollectionTable(name="url_property", [email protected](name="url_id"))
private Map<String,String> properties;
的“url_property”表有一个ID(主键)列,也许是这个原因,当我创建具有多个属性的一个新的URL的实体,我的脚异常
[ERROR]: org.hibernate.engine.jdbc.spi.SqlExceptionHelper - Duplicate entry '' for key 'PRIMARY'
保存。有谁知道我必须做什么来为我的url_property表自动生成ID?我宁愿不写一个触发器,而是做一些JPA,或者至少是Hibernate的批准。
编辑:每在回答第一个建议,我尝试
@ElementCollection(fetch=FetchType.EAGER)
@Column(name="property_value")
@CollectionTable(name="url_property", [email protected](name="url_id"))
private Set<UrlProperty> properties;
,但它造成了例外,“org.hibernate.MappingException:外键(FK24E4A95BB0648B:url_property [properties_id]))必须与引用的主键(url_property [url_id,properties_id])具有相同的列数“”。
我UrlProperty实体
@Entity
@Table(name = "url_property")
public class UrlProperty
{
@Id
@GeneratedValue(generator = "uuid-strategy")
private String id;
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="URL_ID")
private SubdomainUrl url;
@Column(name="PROPERTY_NAME")
private String propertyName;
@Column(name="PROPERTY_VALUE")
private String propertyValue;
url_property“id”列将成为它所涉及的Url类的“id”(即FK)。您不会为收集表生成它们。当使用Map时,我希望“url_id”和“property_name”是“url_property”表的组合PK。 – 2014-10-01 15:37:36
好吧,那么如何让JPA根据您的建议生成复合主键?现在看来,生成的关键字只是空字符串。 – Dave 2014-10-01 15:56:20
应该是自动的,不需要进一步配置...或者至少它是用于我的JPA提供程序(DataNucleus)。 – 2014-10-01 16:03:19