我正在使用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;
答案 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。虽然应用程序从不知道该字段,但似乎没有用。