【发布时间】:2014-10-01 15:29:45
【问题描述】:
我正在使用 MySQL 5.5.37、JPA 2.0 和 Hibernate 4.1.0.Final(如果能解决我的问题,我愿意升级)。我有以下实体……
@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", joinColumns=@JoinColumn(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", joinColumns=@JoinColumn(name="url_id"))
private Set<UrlProperty> properties;
但它导致了异常,“org.hibernate.MappingException: Foreign key (FK24E4A95BB0648B:url_property [properties_id])) must have the same number of columns as the referenced primary key (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)。您不会为集合表生成它们。使用地图时,我希望“url_id”和“property_name”是“url_property”表的复合 PK。
-
好的,那么我如何告诉 JPA 按照您的建议生成复合主键?现在,生成的密钥似乎只是空字符串。
-
应该是自动的,不需要进一步配置......或者至少它适用于我的 JPA 提供程序(DataNucleus)。
标签: mysql hibernate jpa jpa-2.0