Java 将db进口国映射到具有JPA的实体
我运行了一些DDL脚本,在数据库中设置了一个完整的国家/地区表。国家表的主键列包含每个国家的相应ISO代码 在我的JPA项目中,我有一个用户实体,它有一个嵌入式地址实体,这个地址实体有一个国家的引用。用户和地址之间的关系对我来说似乎没有问题,但是地址和国家之间的关系。我试图将其映射为多人关系,因为许多地址可以共享一个国家 问题是:我用Id->Now注释了Country类的iso成员变量,JPA/Hibernate抱怨没有手动设置Country的Id。但在本例中,id已经给出并设置好了,因为我导入了一次数据,ISO代码是唯一的,并且通过db schema means声明为主键。在这种特殊情况下,不需要在国家/地区表中进行更新或插入-信息应为只读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已经给出并设置好了,因为我导入
你知道该怎么做吗,这样我就可以使用我的国家表而不必修改?你的问题缺少一些细节,因此下面涉及到很多猜测:- 您的国家/地区课程应该类似于:
@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。是否可以发布实体代码?