봄 저장소 세대 대산 naming convention
-
21-12-2019 - |
문제
내가 사용하는 javax.persistence
고 봄 나는 간단하이터베이스는 간단하고 CrudRepository
는 일이 잘 될 때까지 정보를 보호하기 위해 내 자신 findByXXX()
방법입니다.
나이터베이스는 다음과 같습니다:
@Entity
public class Node
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column (name = "ID")
private Integer mID;
/** The node's activity. */
@Column (name = "Activity", nullable = false, length = 200)
private String mActivity;
// ... other properties.
public Integer getId() { return mID; }
public void setId(Integer id) { mID = id; }
public String getActivity() { return mActivity; }
public void setActivity(String activity) { mActivity = activity; }
...
}
알면 나를 사용하여 이름 지정 규칙의'm'접두사에서 인스턴스의 속성입니다.이와 함께 저장소 내 때까지 내가 내 자신 findByXXX()
방법이 있습니다.그래서 저장할 수 있습 검색 Node
데이터 저장소에서 사용하는 표준 CRUD 방법됩니다.
도우 및 추가 나 자신의 쿼리법에 따라서:
public interface NodeRepository extends CrudRepository<Node, Integer>
{
public List<Node> findByActivity(String activity);
}
내 시스템이 중단됩니다.구체적으로 자동 결선의 저장소에 실패하십시오(스택 추적에의 끝 이후).더 많은 행운에 의해 디자인 보다는,내가 찾는 경우 수정 나의 노드 클래스를 사용하지 않습니다 더 이상'm'접두사에서 속성입니다.는 것입니다,다음 코드를 사용해야 합니다:
@Entity
public class Node
{
...
/** The node's activity. */
@Column (name = "Activity", nullable = false, length = 200)
private String activity;
// ... other properties.
public String getActivity() { return activity; }
public void setActivity(final String activity) { this.activity = activity; }
...
}
그것은 보이는 것 때 봄은 건물 findByActivity()
방법 검색 Node
콩 속성 이름을(예를 들어. activity
)보다는,제공 방법(예를 들어. getActivity(), setActivity()
).
사람이 알고 있는 경우에 이것은 실제로까요?그렇다면,제를 해결할 방법이 있습니까 그래서 그것을 유지할 수 있는 내 이름 지정 규칙?나는 결혼을,그것은 뭔가가 나는 사용됩니다.
PS:내가 사용하여 봄 3.2.x Java7
편집을 추가하는 스택 추적-프로그램 내에서 실행 SpringJUnit4ClassRunner:
INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@32f2e8ca: defining beans [nodeRepository,org.springframework.data.repository.core.support.RepositoryInterfaceAwareBeanPostProcessor#0,org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor#0,dataSource,entityManagerFactory,transactionManager,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor]; root of factory hierarchy
Nov 18, 2013 6:59:10 PM org.springframework.test.context.TestContextManager prepareTestInstance
SEVERE: Caught exception while allowing TestExecutionListener [org.springframework.test.context.support.DependencyInjectionTestExecutionListener@57b3fe3c] to prepare test instance [com.example.persistence.JPAXMLCfgTest@69f8421f]
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.example.persistence.JPAXMLCfgTest': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.example.persistence.NodeRepository com.example.persistence.JPAXMLCfgTest.mRepo; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'nodeRepository': FactoryBean threw exception on object creation; nested exception is java.lang.NullPointerException
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:287)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1106)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireBeanProperties(AbstractAutowireCapableBeanFactory.java:374)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:110)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:75)
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:312)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:211)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:288)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:284)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:88)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252)
at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)
at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.example.persistence.NodeRepository com.example.persistence.JPAXMLCfgTest.mRepo; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'nodeRepository': FactoryBean threw exception on object creation; nested exception is java.lang.NullPointerException
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:513)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:92)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:284)
... 32 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'nodeRepository': FactoryBean threw exception on object creation; nested exception is java.lang.NullPointerException
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:149)
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:102)
at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1442)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:248)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:871)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:813)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:730)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:485)
... 34 more
Caused by: java.lang.NullPointerException
at org.springframework.data.jpa.repository.query.QueryUtils.isEntityPath(QueryUtils.java:462)
at org.springframework.data.jpa.repository.query.QueryUtils.toExpressionRecursively(QueryUtils.java:445)
at org.springframework.data.jpa.repository.query.JpaQueryCreator$PredicateBuilder.build(JpaQueryCreator.java:197)
at org.springframework.data.jpa.repository.query.JpaQueryCreator.toPredicate(JpaQueryCreator.java:144)
at org.springframework.data.jpa.repository.query.JpaQueryCreator.create(JpaQueryCreator.java:86)
at org.springframework.data.jpa.repository.query.JpaQueryCreator.create(JpaQueryCreator.java:44)
at org.springframework.data.repository.query.parser.AbstractQueryCreator.createCriteria(AbstractQueryCreator.java:109)
at org.springframework.data.repository.query.parser.AbstractQueryCreator.createQuery(AbstractQueryCreator.java:88)
at org.springframework.data.repository.query.parser.AbstractQueryCreator.createQuery(AbstractQueryCreator.java:73)
at org.springframework.data.jpa.repository.query.PartTreeJpaQuery$QueryPreparer.<init>(PartTreeJpaQuery.java:98)
at org.springframework.data.jpa.repository.query.PartTreeJpaQuery$CountQueryPreparer.<init>(PartTreeJpaQuery.java:166)
at org.springframework.data.jpa.repository.query.PartTreeJpaQuery.<init>(PartTreeJpaQuery.java:60)
at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:90)
at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateIfNotFoundQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:162)
at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$AbstractQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:68)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.<init>(RepositoryFactorySupport.java:290)
at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:158)
at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.getObject(RepositoryFactoryBeanSupport.java:162)
at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.getObject(RepositoryFactoryBeanSupport.java:44)
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:142)
... 42 more
해결책
여기를 참조하십시오 documatation 는 방법에 대한 쿼리를 보실 수 있습니다.
그래서 짧은의 이름을 지정하는 방법:
public List<Node> findByMActivity(String activity);
이동 또는 당신의 매핑하는 방법들을 통해 보다는 오히려 분야에만 확실한 방법은 실제로 주석은 이 방법으로@쿼리 또는 정의된 쿼리를 다른 곳에는 이 방법을 참조.
@Query("my custom query")
public List<Node> findByActivity(String activity);
그것을 하에서 보다 일반적인 방법으로 난 것을 보고 무시하거나 전달하는 사용자 지정 QueryResolver to:
org.springframework.데이터입니다.jpa.장합니다.쿼리가 있습니다.JpaQueryMethod
어쨌든 모든 것 같다 번거 로움을 많이 그냥 당신의 분야로 시작'm'.
다른 팁
하지만 나는 다음과 같@Alan 헤이의 응답,또 다른 옵션은 추가하"서비스"층의 솔루션을 제공합니다.나는 이것에서는,과거를 만들기 위해서 인터페이스를 CRUD 작업에서 나의 모델층이다.
을 만들 수 있습니다 서비스 등의 이름으로 getter 원하는 방법,즉 findByActivity
, 부르고,저장소 등' findByMActivity(...
방법입니다.
이것은 또한 당신이 당신을 모델 레이어와 모든 사용 가능한 CRUD 방법이고,서비스 개체만 사용 CRUD 작업에 관련된 특정 서비스,즉ActivityService.본질적으로 만들 수 있는 여러 인터페이스에 대한 동일에 따라 데이터 작업에서 수행되고 있는 데이터입니다.
그런 다음 서비스를 레이어 클래스를 가질 수 있습니다 어떤 메서드 이름이 감각을 만들 것은 사용자,즉findByActivity 대 findByMActivity.Martin Fowler 설명합니다 서비스 층라.
귀하의 솔루션을 호출 할 수도 있에 대한 추가적인 레이어지만,그것은 될 수 있습니다 추가한 추상화를 해결할 수 있는 인터페이스 문제는 이와 같이 될 것이 더 많은 비용이 많이 변화하는 도메인 변수의 이름입니다.