私はかなり長い間この問題を解決しようとしてきましたが、成功しませんでした。私は使っている:
- 春 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)
これは非常に単純なマッピング方法のように思えますが、私が見た例はすべて双方向です。それでも、なぜこれが機能しないのかわかりません。