当它是java.util.Map时,如何为@ElementCollection自动生成ID?

时间:2014-10-01 15:29:46

标签: mysql hibernate jpa jpa-2.0

我正在使用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;

但导致异常,&#34; org.hibernate.MappingException:外键(FK24E4A95BB0648B:url_property [properties_id]))必须与引用的主键具有相同的列数(url_property [url_id,properties_id]) &#34;

我的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;

1 个答案:

答案 0 :(得分:0)

您只告诉JPA表中有3个字段(“property_name”,“property_value”和“url_id”),因此无法知道用作pk的第4个字段。由于它不是实体,因此它没有维护的标识。选项包括:

1)将“url_property”表映射到Property实体,该实体将具有ID,值和对Url的引用。然后,Url将对Property类具有1:M引用,并且仍然可以键入名称。 http://wiki.eclipse.org/EclipseLink/Examples/JPA/2.0/MapKeyColumns有一个例子

2)更改您的表以删除ID字段,而是使用“property_name”,“property_value”和“url_id”作为主键。

3)设置触发器以填充ID。虽然应用程序从不知道该字段,但似乎没有用。