Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/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
Java 你如何绘制一张“地图”;“地图”;在hibernate中使用注释?_Java_Hibernate_Orm_Mapping - Fatal编程技术网

Java 你如何绘制一张“地图”;“地图”;在hibernate中使用注释?

Java 你如何绘制一张“地图”;“地图”;在hibernate中使用注释?,java,hibernate,orm,mapping,Java,Hibernate,Orm,Mapping,使用注释如何将实体中的字段映射到给定对象,该实体是字符串的“映射”(哈希表)?对象已被注释,其实例已存储在hibernate数据库中 我找到了使用简单键和值定义映射的语法,如下所示: ... 奇怪的是,一个实体作为键,一个简单类型作为值,如下所示: ... ... 但是对于简单的键到元素映射,我看不到如何做到这一点,也看不到如何使用注释来做到这一点。您可能应该使用UserType或UserCollectionType。或者,您可以使用自定义tupleizer 有关概念和等效注释方法,请参

使用注释如何将实体中的字段映射到给定对象,该实体是字符串的“映射”(哈希表)?对象已被注释,其实例已存储在hibernate数据库中

我找到了使用简单键和值定义映射的语法,如下所示:


...
奇怪的是,一个实体作为键,一个简单类型作为值,如下所示:


...
...

但是对于简单的键到元素映射,我看不到如何做到这一点,也看不到如何使用注释来做到这一点。

您可能应该使用UserType或UserCollectionType。或者,您可以使用自定义tupleizer

有关概念和等效注释方法,请参见

如果这不是您想要的,请告诉我。

@collectionfelments(fetch=FetchType.LAZY)
@CollectionOfElements(fetch = FetchType.LAZY)
@JoinTable(name = "JOINTABLE_NAME",
    joinColumns = @JoinColumn(name = "id"))
@MapKey(columns = @Column(name = "name"))
@Column(name = "age")
private Map<String, String> ages = new HashMap<String, String>();
@JoinTable(name=“JoinTable\u name”, joinColumns=@JoinColumn(name=“id”)) @MapKey(columns=@Column(name=“name”)) @列(name=“age”) 私有映射年龄=新HashMap();
您只需使用JPA注释
@MapKey
(请注意,JPA注释不同于Hibernate注释,Hibernate映射保存映射键的数据库列,而JPA注释映射要用作映射键的属性)

@javax.persistence.OneToMany(cascade=CascadeType.ALL)
@javax.persistence.MapKey(name=“name”)
私有映射nameToPerson=newhashmap();

我知道这个问题很老了,但也许这可以帮助别人

其他可能性如下:

@Entity
@Table(name = "PREFERENCE", uniqueConstraints = { @UniqueConstraint(columnNames = { "ID_DOMAIN", "ID_USER", "KEY" })})
public class Preferences {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ID", unique = true, nullable = false)
    private Long id;

    @Column(name = "ID_DOMAIN", unique = false, nullable = false")
    private Long domainId;

    @Column (name = "PREFERENCE_KEY")
    @Enumerated(EnumType.STRING)
    private PreferenceKey key;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "ID_USER", referencedColumnName = "ID")
    private User user;
}

and 

@Entity
@Table(name = "USER", uniqueConstraints = { @UniqueConstraint(columnNames = { "ID_DOMAIN", "LOGIN" })})
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ID", unique = true, nullable = false)
    private Long id;

    @Column(name = "ID_DOMAIN", unique = false, nullable = false")
    private Long domainId;

    // more fields

    @ElementCollection(fetch = FetchType.LAZY)
    @JoinColumns({@JoinColumn(name = "ID_USER", referencedColumnName = "ID"), @JoinColumn(name = "ID_DOMAIN", referencedColumnName = "ID_DOMAIN")})
    @OneToMany(targetEntity = Preferences.class, fetch = FetchType.LAZY)
    @MapKey(name = "key")
    private Map<PreferenceKey, Preferences> preferencesMap;
}
@实体
@表(name=“PREFERENCE”,uniqueConstraints={@UniqueConstraint(columnNames={“ID\u DOMAIN”,“ID\u USER”,“KEY”})})
公共阶级偏好{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(name=“ID”,unique=true,nullable=false)
私人长id;
@列(name=“ID\u DOMAIN”,unique=false,nullable=false)
私有长域ID;
@列(name=“PREFERENCE\u KEY”)
@枚举(EnumType.STRING)
私钥;
@manytone(fetch=FetchType.LAZY)
@JoinColumn(name=“ID\u USER”,referencedColumnName=“ID”)
私人用户;
}
及
@实体
@表(name=“USER”,uniqueConstraints={@UniqueConstraint(columnNames={“ID\u DOMAIN”,“LOGIN”})
公共类用户{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(name=“ID”,unique=true,nullable=false)
私人长id;
@列(name=“ID\u DOMAIN”,unique=false,nullable=false)
私有长域ID;
//更多领域
@ElementCollection(fetch=FetchType.LAZY)
@JoinColumns({@JoinColumn(name=“ID\u USER”,referencedColumnName=“ID”),@JoinColumn(name=“ID\u DOMAIN”,referencedColumnName=“ID\u DOMAIN”))
@OneToMany(targetEntity=Preferences.class,fetch=FetchType.LAZY)
@MapKey(name=“key”)
私有地图优先权;
}

这只会生成两个表用户和首选项,请注意,PreferenceKey对于进入域的用户来说是唯一的

我不想听起来像个白痴,但我整天都在断断续续地查看这两个页面,我似乎不明白。我一直在研究这种风格:这似乎是我需要的东西,我只是不知道如何作为注释。如果元素不是字符串,我也不知道该怎么做。是的,我想你真的想要一个用户类型,因为这里讨论的所有其他事情(我相信)都创建了另一个表来存储地图。查看UserType接口,您将看到只有几个方法可以实现。基本上是告诉hibernate,给定一个ResultSet,如何将其放入java类型,反之亦然。这就是我要寻找的类型。但是,如果键是一个字符串(如示例中所示),而值是另一个对象,我将如何做?这看起来类似于映射枚举的注释。@Omar:应该像替换“字符串”一样简单使用您选择的实体类型。您可能需要删除@Column(name=“age”)并向@JoinTable注释添加类似inverseJoinColumns=@JoinColumn(name=“fk_-ik”)的内容。不确定。我尝试了类似的方法来持久化ArrayList(反向连接列),但在DBUnit测试中遇到了一些问题。他们无法删除表来重新填充它们,因为这两个表之间存在循环依赖关系。您是否尝试将单个ArrayList持久化为映射值?谢谢,我将尝试此方法。这反映了什么样的数据库模式?我正在使用DB单元,希望能够使用XML填充数据集。这是否使用联接表?如果是,您可以指定表的调用方式以及联接表的列吗?@Omar它会创建一个联接表(默认情况下为FOO_PERSON)。您可以使用
@javax.persistence.JoinTable
控制名称。不确定这些列。这里的解释是正确的
@Entity
@Table(name = "PREFERENCE", uniqueConstraints = { @UniqueConstraint(columnNames = { "ID_DOMAIN", "ID_USER", "KEY" })})
public class Preferences {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ID", unique = true, nullable = false)
    private Long id;

    @Column(name = "ID_DOMAIN", unique = false, nullable = false")
    private Long domainId;

    @Column (name = "PREFERENCE_KEY")
    @Enumerated(EnumType.STRING)
    private PreferenceKey key;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "ID_USER", referencedColumnName = "ID")
    private User user;
}

and 

@Entity
@Table(name = "USER", uniqueConstraints = { @UniqueConstraint(columnNames = { "ID_DOMAIN", "LOGIN" })})
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ID", unique = true, nullable = false)
    private Long id;

    @Column(name = "ID_DOMAIN", unique = false, nullable = false")
    private Long domainId;

    // more fields

    @ElementCollection(fetch = FetchType.LAZY)
    @JoinColumns({@JoinColumn(name = "ID_USER", referencedColumnName = "ID"), @JoinColumn(name = "ID_DOMAIN", referencedColumnName = "ID_DOMAIN")})
    @OneToMany(targetEntity = Preferences.class, fetch = FetchType.LAZY)
    @MapKey(name = "key")
    private Map<PreferenceKey, Preferences> preferencesMap;
}