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