Mysql 当@ElementCollection是java.util.Map时,如何为它自动生成ID?
我使用的是MySQL 5.5.37、JPA2.0和Hibernate 4.1.0。如果问题解决了,我愿意升级。我有以下实体Mysql 当@ElementCollection是java.util.Map时,如何为它自动生成ID?,mysql,hibernate,jpa,jpa-2.0,Mysql,Hibernate,Jpa,Jpa 2.0,我使用的是MySQL 5.5.37、JPA2.0和Hibernate 4.1.0。如果问题解决了,我愿意升级。我有以下实体 @Entity @Table(name = "url") public class Url implements Serializable { … @ElementCollection(fetch=FetchType.EAGER) @MapKeyColumn(name="property_name") @Column(name="prop
@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\u属性表生成ID吗?我宁愿不写触发器,而是做一些JPA认可的事情,或者至少是Hibernate认可的事情
编辑:根据答案中的第一个建议,我尝试了
@ElementCollection(fetch=FetchType.EAGER)
@Column(name="property_value")
@CollectionTable(name="url_property", joinColumns=@JoinColumn(name="url_id"))
private Set<UrlProperty> properties;
您只告诉JPA表property_name、property_value和url_id中的3个字段,因此它无法知道用作pk的第4个字段。因为它不是一个实体,所以它没有一个被维护的标识。选项包括: 1将url_属性表映射到属性实体,该实体将具有url的ID、值和引用。然后Url将有一个对属性类的1:M引用,并且仍然可以键入名称。他有一个例子 2更改表以删除ID字段,并改为使用属性名称、属性值和url ID作为主键
3设置一个触发器来填充ID。但似乎没有什么用处,因为应用程序无论如何都不会知道该字段。url\u属性ID列将是它所关联的url类的ID,即FK。您不会为集合表生成它们。当使用映射时,我希望url\u id和property\u name是url\u属性表的组合主键?现在,生成的密钥似乎只是空字符串。应该是自动的,不需要进一步配置。。。或者至少对我的JPA提供商DataNucleus是这样。对于您的第一个建议,我在我的问题中尝试了上述方法,但它导致了org.hibernate.MappingException:外键FK24E4A95BB0648B:url_属性[properties_id]必须与引用的主键url_属性[url_id,properties_id]具有相同的列数。有什么想法吗?对于1,我建议使用OneToMany而不是元素集合,如链接中的第一个示例所述。例外情况是因为您使用的是ElementCollection,这意味着对象没有自己的ID,必须使用其父对象的标识。删除ElementCollection、Column和CollectionTable注释并将其替换为OneToNameAppedby=SubdomainUrl将解决此问题
@ElementCollection(fetch=FetchType.EAGER)
@Column(name="property_value")
@CollectionTable(name="url_property", joinColumns=@JoinColumn(name="url_id"))
private Set<UrlProperty> properties;
@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;