gpt4 book ai didi

java - JPA注释复合主键也是一对多外键

转载 作者:太空宇宙 更新时间:2023-11-04 06:29:08 27 4
gpt4 key购买 nike

我已经为此工作了几天,但还没有看到与我正在尝试做的事情相匹配的示例,或者我错过了它,因为我对 Hibernate 和 JPA 有点陌生。我正在尝试将一些 hibernate 代码转换为 JPA,但似乎无法正确获取特定的连接。

这是我的表结构:

Table AppUser

  • id (PK)

Table SecurityQuestion

  • id (PK)

Table AppUserSecurityQuestion

  • AppUserId (PK, FK to AppUser.id)

  • SecurityQuestionId (PK, FK to SecurityQuestion.id)

这是我对我的域所做的尝试(只是相关的属性声明):

BaseEntity.java

@MappedSuperclass
public abstract class BaseEntity implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="id", updatable=false, nullable=false)
private Integer id;
...
}

AppUser.java

@Entity
@Table(name="AppUser")
public class AppUser extends BaseEntity {
@OneToMany(fetch=FetchType.EAGER)
@MapKeyJoinColumn(name="AppUserId")
private Set<AppUserSecurityQuestion> securityAnswers;
...
}

AppUserSecurityQuestion.java

@Entity
@Table(name="AppUserSecurityQuestion")
public class AppUserSecurityQuestion implements java.io.Serializable {
@EmbeddedId
private AppUserSecurityQuestionId id;
...
}

AppUserSecurityQuestionId.java

@Embeddable
public class AppUserSecurityQuestionId implements java.io.Serializable {
private AppUser appUser;
private SecurityQuestion securityQuestion;
...
}

这适用于 hibernate 配置,但我再次尝试将其转换为 JPA。以下是 hbm 文件的相关部分:

AppUser.hbm.xml

<hibernate-mapping default-access="field">
<class catalog="WEBR" name="testapp.domain.AppUser" schema="dbo" table="AppUser">
<id name="appUserId" type="java.lang.Integer">
<column name="AppUserId" />
<generator class="org.hibernate.id.enhanced.SequenceStyleGenerator">
<param name="sequence_name">AppUserSeq</param>
</generator>
</id>
...
<set name="securityAnswers" table="AppUserSecurityQuestion" inverse="true" lazy="false">
<key column="AppUserId" not-null="true" />
<one-to-many class="testapp.domain.AppUserSecurityQuestion" />
</set>


</class>
</hibernate-mapping>

AppUserSecurityQuestion.hbm.xml

<hibernate-mapping>
<class name="testapp.domain.AppUserSecurityQuestion" table="AppUserSecurityQuestion" schema="dbo" catalog="TEST">
<composite-id name="id" class="testapp.domain.AppUserSecurityQuestionId">
<key-many-to-one name="appUser" class="testapp.domain.AppUser">
<column name="id"/>
</key-many-to-one>
<key-many-to-one name="securityQuestion" class="testapp.domain.SecurityQuestion">
<column name="SecurityQuestionId" />
</key-many-to-one>
</composite-id>
<property name="answer" type="java.lang.String">
<column name="Answer" not-null="true" />
</property>
</class>
</hibernate-mapping>

我基本上只是想查看 hbm 并将每个部分转换为 JPA,但当我尝试通过应用程序访问数据时出现此异常时,我显然错过了一些东西:

org.hibernate.exception.SQLGrammarException: could not extract ResultSet ... Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Invalid object name 'AppUser_AppUserSecurityQuestion'

这也是 HQL:

select securityan0_.AppUser_id as AppUser_1_0_0_, securityan0_.securityAnswers_appUser as security2_3_0_, securityan0_.securityAnswers_securityQuestion as security3_3_0_, appusersec1_.appUser as appUser1_2_1_, appusersec1_.securityQuestion as security2_2_1_, appusersec1_.Answer as Answer3_2_1_ from AppUser_AppUserSecurityQuestion securityan0_ inner join AppUserSecurityQuestion appusersec1_ on securityan0_.securityAnswers_appUser=appusersec1_.appUser and securityan0_.securityAnswers_securityQuestion=appusersec1_.securityQuestion where securityan0_.AppUser_id=?

我显然错误地声明了我的连接,但我不确定此时还可以尝试什么。有人看到我做错了什么吗?

最佳答案

想通了...至少它看起来按照我需要的方式工作。以下是我需要进行的更改:

AppUser.java

@Entity
@Table(name="AppUser")
public class AppUser extends BaseEntity {
@OneToMany(mappedBy="id.appUser", fetch=FetchType.EAGER)
@MapKeyJoinColumn(name="id")
private Set<AppUserSecurityQuestion> securityAnswers;
...
}

AppUserSecurityQuestionId.java

@Embeddable
public class AppUserSecurityQuestionId implements java.io.Serializable {
@ManyToOne
@JoinColumn(name="AppUserId")
private AppUser appUser;
@ManyToOne
@JoinColumn(name="SecurityQuestionId")
private SecurityQuestion securityQuestion;
...
}

其他一切保持原样。

关于java - JPA注释复合主键也是一对多外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26366281/

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