0

私はかなり長い間この問題を解決しようとしてきましたが、成功しませんでした。私は使っている:

  • 春 3.1.1
  • 休止状態 4.0.1.Final
  • spring-data-jpa 1.0.2.RELEASE
  • MySQL 5 (org.hibernate.dialect.MySQL5InnoDBDialect)

OneToOne の非方向性関連付けを持つ 2 つのエンティティがあります。テーブル間に外部キー関係はありません

@Entity
@Table(name = "User", uniqueConstraints = @UniqueConstraint(columnNames = "UserName"))
public class User {

    // Fields
    private Long userId;
    private Integer status = 0;
    private String password;
    private Long userRoleId;
    private String userName;
    private UserRole userRole;
...
    @OneToOne
    @JoinColumn(name = "userRoleId")
    public UserRole getUserRole() {
        return userRole;
    }
}

そして、参照としてカスケード削除/何でもしたくない別のクラス

@Entity
@Table(name = "UserRole")
public class UserRole {

// Fields
private Long userRoleId;
private String userRoleDescriptionShort;
private String userRoleDescription;

    @Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long getUserRoleId() {
    return this.userRoleId;
}
}

各テーブルには、bigint として宣言された userRoleId があります

私は2つのリポジトリを持っています:

@Repository
public interface IUserRepository extends CrudRepository<User, Long> {
public User findByUserName(String userName);
 }

@Repository
@Transactional(readOnly = true)
public class UserRepository extends QueryDslRepositorySupport implements IUserRepository {

@PersistenceContext
private EntityManager em;

@Override
public User findByUserName(String userName) {
    QUser user = QUser.user;
    User auser = (User) from(user).where(user.userName.eq(userName));
    return auser;
}

@Transactional(readOnly = true)
public interface IUserRoleRepository extends CrudRepository<UserRole, Long> {

public UserRole findByRoleDescriptionShort(String roleDescriptionShort);

}

@Repository
Transactional(readOnly = true)
public class UserRoleRepository extends QueryDslRepositorySupport implements IUserRoleRepository     {

@PersistenceContext
private EntityManager em;

@Override
public UserRole findByRoleDescriptionShort(String roleDescriptionShort) {
    QUserRole userRole = QUserRole.userRole;
    UserRole arole = (UserRole) from(userRole).where(userRole.userRoleDescriptionShort.equalsIgnoreCase("Owner"));
    return arole;
}

ただし、ビルドすると次のエラーが発生します。

Caused by: java.lang.IllegalArgumentException: No property role found for type class     com.edelweissco.model.people.UserRole
    at org.springframework.data.repository.query.parser.Property.<init>(Property.java:76)
    at org.springframework.data.repository.query.parser.Property.<init>(Property.java:97)
    at org.springframework.data.repository.query.parser.Property.create(Property.java:312)
    at org.springframework.data.repository.query.parser.Property.create(Property.java:326)
    at org.springframework.data.repository.query.parser.Property.create(Property.java:326)
    at org.springframework.data.repository.query.parser.Property.create(Property.java:292)
    at org.springframework.data.repository.query.parser.Property.from(Property.java:251)
    at org.springframework.data.repository.query.parser.Property.from(Property.java:232)
at org.springframework.data.repository.query.parser.Part.<init>(Part.java:48)
at org.springframework.data.repository.query.parser.PartTree$OrPart.<init>(PartTree.java:242)
at org.springframework.data.repository.query.parser.PartTree.buildTree(PartTree.java:101)
at org.springframework.data.repository.query.parser.PartTree.<init>(PartTree.java:77)
at org.springframework.data.jpa.repository.query.PartTreeJpaQuery.<init>  

(PartTreeJpaQuery.java:56)
    at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:92)
    at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateIfNotFoundQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:159)
    at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$AbstractQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:71)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.<init>(RepositoryFactorySupport.java:303)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:157)
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.getObject(RepositoryFactoryBeanSupport.java:120)
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.getObject(RepositoryFactoryBeanSupport.java:39)
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:142)

これは非常に単純なマッピング方法のように思えますが、私が見た例はすべて双方向です。それでも、なぜこれが機能しないのかわかりません。

4

1 に答える 1

1

これは遅い回答ですが、あなたのマッピングには同意しません。UserRole への外部キーである userRoleId と呼ばれる User の列があることを指定する JoinColumn で OneToOne を宣言しました。したがって、外部キーが必要です。

また、これが OneToOne の関係であるとは思えません。ユーザーを削除するときに UserRole をカスケード削除するべきではないと述べました。UserRole は任意の数のユーザーに関連付けることができるようです。したがって、User のマッピングは ManyToOne である必要があります。

OneToOne は通常、2 つのテーブルが同じキーを共有している場合に適しています。つまり、PrimaryKeyJoinColumn を使用してそれらが主キーを共有していることを示します。この場合、2 つのエンティティは異なるキーを持ちます。

于 2012-11-26T02:31:24.763 に答える