gpt4 book ai didi

java - 基本类型的一对一映射,到 Hibernate 中的单个类

转载 作者:搜寻专家 更新时间:2023-11-01 00:52:32 24 4
gpt4 key购买 nike

所以情况是这样的:有一个entity需要用字典连接。想象一下下面的结构

create table Address (
addressId bigint not null,
addressLine1 varchar(255),
city varchar(255),
country varchar(255),
state varchar(255),
zipCode varchar(255),
primary key (addressId)
)

create table STATES_DICT (
state_code varchar(255),
state_fullname varchar(255),
primary key (state_code)
)

我想将 ADDRESS 和 STATE_DICTIONARY 映射到一个实体中。

@Entity
@Table(name = "ADDRESS")
public class Address implements Serializable {

@Id
@Column(name = "ADDRESSID")
private int addressId;

@Column(name = "ADDRESSLINE1")
private String addressLine1;

@Column(name = "STATE")
private String state;

//??? annotations
private String fullStateName;

@Column(name = "ZIPCODE")
private String zipCode;

@Column(name = "CITY")
private String city;

@Column(name = "COUNTRY")
private String country;
//... getters and setters
}

对于纯 SQL,我将运行

select a.ADDRESSID, a.ADDRESSLINE1, a.CITY, a.ZIPCODE, a.STATE, 
d.STATE_FULLNAME, a.COUNTRY
from ADDRESS a, STATES_DICT d where a.STATE = d.STATE_CODE

但是我在使用 JPA 映射它时遇到了严重的问题。

  1. 我不能使用@SecondaryTable,因为这些表不是由主键映射的
  2. 我能得到的最好的是:
    @ElementCollection
@JoinTable(name="STATES_DICT",
joinColumns=@JoinColumn(name="STATE_CODE", referencedColumnName="STATE"))
@Column(name = "STATE_FULLNAME")
private Collection<String> fullStateName;

缺点是 - 映射始终是一对一的,Collection 会带来困惑,并且关系更多是一对一(多对一)而不是一对多。

有什么想法吗?对于一对一映射,是否有等效于 @ElementCollection 的东西?删除 @ElementCollection 没有帮助。 fullStateName 字段应位于 ADDRESS 列中 - 但事实并非如此。

一些注意事项:* 我需要将这两个放在一个实体中。* 我正在扩展现有的解决方案,只需要添加这个字典列* 该实体稍后由一些仅通过原始类型运行的其他服务处理。我宁愿不更改服务,这就是添加 @OneToOne 关系不可取的原因

非常感谢


我正在使用 @SecondaryTable 示例扩展问题 - 这对我不起作用。

@Entity
@Table(name = "ADDRESS")
@SecondaryTable(name="STATES_DICT",
pkJoinColumns=@PrimaryKeyJoinColumn(columnDefinition="STATE_CODE", referencedColumnName="STATE"))
public class Address implements Serializable {

@Id
@Column(name = "ADDRESSID")
private int addressId;

@Column(name = "ADDRESSLINE1")
private String addressLine1;

@Column(name = "STATE")
private String state;

@Column(table="STATES_DICT", name = "STATE_FULLNAME")
private String fullStateName;

@Column(name = "ZIPCODE")
private String zipCode;

@Column(name = "CITY")
private String city;

@Column(name = "COUNTRY")
private String country;

//... getters and setters
}

这导致了一个令人讨厌的异常:Caused by: org.hibernate.AnnotationException: SecondaryTable JoinColumn 无法引用非主键


郑重声明 - 我找不到执行此操作的方法(并假设这根本不是应该完成的方法)。我已经使用关系注释(@ManyToOne、@OneToOne)和@JoinColumn - 所以是正确的方法。我调整了进一步的处理逻辑,以处理@JoinColumn 注释的方式与处理@Column 的方式相同。它奏效了。

进一步处理是一项安全功能,它会抑制基于用户角色和原始数据库列名称的值。这就是为什么坚持使用 @Column 注释对我来说如此重要

最佳答案

user2601805 的回答是正确的

@PrimaryKeyJoinColumn(name="STATE_CODE", referencedColumnName="STATE")

在您的情况下,这应该足够了,因为您只需要来自 STATES_DICT 的属性。

我还问了一个与 JPA 相关的问题,该问题显示了使用 @SecondaryTable 和 @Embeddable 实现类似于 @ElementCollection 但用于 @OneToOne 的示例

另见此博客,例如 http://www.bagdemir.com/2013/03/03/mapping-embeddable-objects-whichve-no-identities-using-multiple-tables-with-jpahibernate/

关于java - 基本类型的一对一映射,到 Hibernate 中的单个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7665839/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com