我正在研究使用Hibernate 4.1.9注释地图的不同方法
如果我想存储一个Map,其中键是实体值的属性,标记如下所示
@OneToMany(mappedBy = "deptById", targetEntity = com.demo.impls.Employee.class)
@MapKey(name = "entityId")
private Map<Long, Employee> employeesById;
请注意,上面的标记不会创建连接表,而是在运行时通过查询返回Map,因此Map是动态的,您不必在map中添加元素Java查询返回它们。
现在,我希望地图的内容反映应用程序添加到地图中的内容,而不是执行动态查询。
我想储存4种不同的地图
private Map<String, String> map0;
private Map<String, Entity> map1;
private Map<Entity, String> map2;
private Map<Entity, Entity> map3;
在这些情况下,键之间没有关系
我尝试了以下方法
@Entity
public class Department {
@ElementCollection
@CollectionTable(name = "TEST_MAP0")
@Column(name="value")
@MapKeyColumn(name="Key")
private Map<String, String> map0;
@ElementCollection(targetClass = com.demo.bb.impls.Employee.class)
@CollectionTable(name = "TEST_MAP1")
@Column(name="value")
@MapKeyColumn(name="Key")
private Map<String, Employee> map1;
@ElementCollection
@MapKeyClass(value = com.demo.bb.impls.Employee.class)
@CollectionTable(name = "TEST_MAP2")
@Column(name="value")
@MapKeyColumn(name="Key")
private Map<Employee, String> map2;
@ElementCollection(targetClass = com.demo.bb.impls.ParkingSpace.class)
@MapKeyClass(value = com.demo.bb.impls.Employee.class)
@CollectionTable(name = "TEST_MAP3")
@Column(name="value")
@MapKeyColumn(name="Key")
private Map<Employee, ParkingSpace> map3;
案例0地图工作正常
其他三种情况的工作范围与您在表中存储数据的范围一样大
但是列名使用@Col列(name="value")覆盖
我尝试使用@ManyToMany注释,如下所示
@ManyToMany(targetEntity = com.demo.bb.impls.Employee.class)
@JoinTable(name = "TEST_MAP1_B")
@Column(name="value")
@MapKeyColumn(name="Key")
private Map<String, Employee> map1_B;
@ManyToMany(targetEntity = com.demo.bb.impls.ParkingSpace.class)
@MapKeyClass(value = com.demo.bb.impls.Employee.class)
@JoinTable(name = "TEST_MAP3_B")
@Column(name="value")
@MapKeyColumn(name="Key")
private Map<Employee, ParkingSpace> map3_B;
但关键是
提前感谢...
更新。。。。查看了@wypieprz的响应后,我想我知道了正确的注释,允许您为值指定列名
通过使用以下内容
@ManyToMany(targetEntity = com.demo.bb.impls.Employee.class)
@JoinTable(name = "TEST_MAP1", inverseJoinColumns=@JoinColumn(name="VALUE"))
@MapKeyColumn(name="KEY")
private Map<String, Employee> map1;
使用inverseJoinColumn,我可以指定值列名。
但如果键是一个实体,我还没有找到指定键列名的方法。正如文档所说的@MapKeyColumn“指定映射键为基本类型的映射的键列的映射”
我也不确定键是实体时要使用的注释
更新2。。。感谢Peter Halicky提供的解决方案。
总之,要命名每个案例的所有3列,您需要这样做。
@ElementCollection
@CollectionTable(name = "TEST_MAP0", joinColumns = @JoinColumn(name = "DEPARTMENT"))
@Column(name = "value")
@MapKeyColumn(name = "key")
private Map<String, String> map0;
@ManyToMany(targetEntity = com.hibernate.elephants.Employee.class)
@JoinTable(name = "TEST_MAP1", joinColumns = @JoinColumn(name = "DEPARTMENT"), inverseJoinColumns = @JoinColumn(name = "value"))
@MapKeyColumn(name = "key")
private Map<String, Employee> map1;
@ElementCollection
@CollectionTable(name = "TEST_MAP2", joinColumns = @JoinColumn(name = "DEPARTMENT"))
@MapKeyClass(value = com.hibernate.elephants.Employee.class)
@MapKeyJoinColumn(name = "key")
@Column(name = "value")
private Map<Employee, String> map2;
@ManyToMany(targetEntity = com.hibernate.elephants.ParkingSpace.class)
@JoinTable(name = "TEST_MAP3", joinColumns = @JoinColumn(name = "DEPARTMENT"), inverseJoinColumns = @JoinColumn(name = "value"))
@MapKeyClass(value = com.hibernate.elephants.Employee.class)
@MapKeyJoinColumn(name="key")
private Map<Employee, com.hibernate.elephants.ParkingSpace> map3;
注:有两种情况指定为ElementCollection,但值为另一个实体的两种情况需要使用manytomy。
我正在使用一个实体作为Map的键,如下所示。使用@MapKeyJoinCol列注释,我可以指定作为map键的列的名称。这在Hibernate上对我有用,不确定其他JPA实现会做什么,但肯定值得尝试。
@ElementCollection
@CollectionTable(name="breed_descriptions", joinColumns={ @JoinColumn(name="breed") })
@Column(name="description")
@MapKeyJoinColumn(name="language")
private Map<Language, String> descriptions = new HashMap<>();
Targets key To be discussed in order to avoid _Warning: potential malicious behavior - trust data has insufficient signatures for remote repository .dkr.ecr.us-east-1.amazonaws.com/app: valid signatur
Snapshot key To rotate the snapshot key: ❯ notary -D -v -s https://127.0.0.1:4443 -d ~/.docker/trust key rotate <aws_account_id>.dkr.ecr.us-east-1.amazonaws.com/app snapshot -r Enter passphrase for ne
Timestamp key The timestamp key can also be rotated: ❯ notary -D -v -s https://127.0.0.1:4443 -d ~/.docker/trust key rotate <aws_account_id>.dkr.ecr.us-east-1.amazonaws.com/app timestamp -r Enter the
Auth0提供了两个JWT库,一个用于Node:Node jsonwebtoken,另一个用于Java:Java JWT。事实证明,JavaJWT不支持公钥/私钥对。 然而,另一个java库jjwt库声称支持该特性。但是,该文档没有显示如何在jjwt中使用自己的公钥/私钥对。 我创建了私有/公钥对,并在Node中成功地使用了node-jsonwebToken: 但是我发现在Java中用JWT无法做
我试图理解使用带有私钥/公钥(RS512)的JSON Web令牌的逻辑,当将从客户端(在本例中是React Native App)发送到服务器的数据有效载荷签名时。 我认为私钥/公钥的全部意义在于将私钥保持为私钥(在我的服务器上),并将公钥交给成功登录应用程序的人。 我认为,对于我的服务器的每个API请求,经过身份验证的应用程序用户将使用公钥创建JWT(在客户端),服务器将使用私钥验证来自API请
我使用secp192r1曲线生成了ECC公钥和私钥。公共密钥数组长度为75,私有密钥数组长度125。为什么私钥比公钥长?为什么私钥的长度不是公钥的两倍?为什么由于secp192r1私钥不是192位=24字节?