2014-10-14 7 views
1

Работал над этим в течение нескольких дней и еще не видел пример, который соответствует тому, что я пытаюсь сделать, или я пропускаю его как Я немного новичок в 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 =?

У меня, очевидно, были введены мои соединения неправильно, но я не уверен, что еще попробовать в этот момент. Кто-нибудь видит, что я делаю неправильно?

ответ

1

Выяснил это ... По крайней мере, похоже, он работает так, как мне это нужно. Вот изменения мне нужно было сделать:

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; 
    ... 
} 

Все остальное осталось как есть.

Смежные вопросы