Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 当@ElementCollection是java.util.Map时,如何为它自动生成ID?_Mysql_Hibernate_Jpa_Jpa 2.0 - Fatal编程技术网

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

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

我使用的是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="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;