Работал над этим в течение нескольких дней и еще не видел пример, который соответствует тому, что я пытаюсь сделать, или я пропускаю его как Я немного новичок в Hibernate и JPA. Я пытаюсь преобразовать некоторый спящий код в JPA и, похоже, не может получить правильное соединение.JPA аннотирует составной первичный ключ, который также является одним из многих внешних ключей.
Вот моя структура таблицы:
Таблица AppUser
- Идентификатор (ПК)
Таблица SecurityQuestion
- идентификатор (ПК)
Таблица AppUserSecurityQuestion
AppUserId (PK, FK к AppUser.id)
SecurityQuestionId (PK, FK для 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;
...
}
Это работает с конфигурацией спящей, но я снова пытаюсь преобразовать его к JPA. Вот соответствующие фрагменты НВМ файлов:
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>
Я в основном просто пытаюсь посмотреть на НВМ и преобразовать каждую часть к JPA, но я, видимо, не хватает что-то, как я получаю это исключение при попытке получить доступ к данным через приложение:
org.hibernate.exception.SQLGrammarException: не удалось извлечь ResultSet ... Вызванный: com.microsoft.sqlserver.jdbc.SQLServerException: Invalid имя объекта 'AppUser_AppUserSecurityQuestion'
Вот HQL, а также:
выберите securityan0_.AppUser_id как AppUser_1_0_0_, securityan0_.securityAnswers_appUser в security2_3_0_, securityan0_.securityAnswers_securityQuestion в security3_3_0_, appusersec1_.appUser в appUser1_2_1_, appusersec1_.securityQuestion в security2_2_1_, appusersec1_.Answer, как Answer3_2_1_ из AppUser_AppUserSecurityQuestion securityan0_ внутреннее соединение AppUserSecurityQuestion appusersec1_ на securityan0_.securityAnswers_appUser = appusersec1_.appUser и securityan0_.securityAnswers_securityQuestion = appusersec1_.securityQuestion где securityan0_.AppUser_id =?
У меня, очевидно, были введены мои соединения неправильно, но я не уверен, что еще попробовать в этот момент. Кто-нибудь видит, что я делаю неправильно?