Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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 将db进口国映射到具有JPA的实体_Java_Hibernate_Jpa_Annotations_Many To One - Fatal编程技术网

Java 将db进口国映射到具有JPA的实体

Java 将db进口国映射到具有JPA的实体,java,hibernate,jpa,annotations,many-to-one,Java,Hibernate,Jpa,Annotations,Many To One,我运行了一些DDL脚本,在数据库中设置了一个完整的国家/地区表。国家表的主键列包含每个国家的相应ISO代码 在我的JPA项目中,我有一个用户实体,它有一个嵌入式地址实体,这个地址实体有一个国家的引用。用户和地址之间的关系对我来说似乎没有问题,但是地址和国家之间的关系。我试图将其映射为多人关系,因为许多地址可以共享一个国家 问题是:我用Id->Now注释了Country类的iso成员变量,JPA/Hibernate抱怨没有手动设置Country的Id。但在本例中,id已经给出并设置好了,因为我导入

我运行了一些DDL脚本,在数据库中设置了一个完整的国家/地区表。国家表的主键列包含每个国家的相应ISO代码

在我的JPA项目中,我有一个用户实体,它有一个嵌入式地址实体,这个地址实体有一个国家的引用。用户和地址之间的关系对我来说似乎没有问题,但是地址和国家之间的关系。我试图将其映射为多人关系,因为许多地址可以共享一个国家

问题是:我用Id->Now注释了Country类的iso成员变量,JPA/Hibernate抱怨没有手动设置Country的Id。但在本例中,id已经给出并设置好了,因为我导入了一次数据,ISO代码是唯一的,并且通过db schema means声明为主键。在这种特殊情况下,不需要在国家/地区表中进行更新或插入-信息应为只读


你知道该怎么做吗,这样我就可以使用我的国家表而不必修改?

你的问题缺少一些细节,因此下面涉及到很多猜测:-

您的国家/地区课程应该类似于:

@Entity
@Immutable
@Table(name="countries")
public class Country {
  @Id
  private String isoCode;
  // all other attributes, getters / setters, etc...
}
@不可变是JPA的一个标准;您不必将它放在实体上,但拥有它将导致稍微好一点的性能。请记住,这将真正使国家不可变-您将无法通过应用程序创建/更新/删除国家。如果您的国家/地区实体使用得足够频繁,您可能还需要对其进行配置

您的地址将具有以下到国家/地区的映射:

@ManyToOne
@JoinColumn(name="country_iso_code")
private Country country;
注意没有级联属性-您不需要任何属性。这里最后一个要点是,您实际上需要获取或加载Country实例以将其设置为address:

Country country = (Country) session.load(Country.class, isoCode);
// OR
Country country = (Country) session.get(Country.class, isoCode);

address.setCountry(country);
...
session.saveOrUpdate(address);

上面的第一行不会命中数据库;如果您知道存在此类ISO代码的国家,请使用该代码。第二个表单将命中数据库或缓存(如果已配置),如果不存在具有该代码的国家/地区,则返回NULL。

是否可以发布实体代码?