2013-05-26 2 views
1

'ProSpring3'이라는 책을 읽었으며 프로젝트에서 스프링 데이터 JPA 기능을 사용하려고합니다. 여기에 관련 파일을 게시 할 예정입니다.스프링 데이터 JPA 감사 기능이 내 프로젝트에서 작동하지 않습니다.

SRC/메인/자바/foo는/바/도메인/ContactAudit.java :

package foo.bar.domain; 

import org.hibernate.annotations.Type; 
import org.joda.time.DateTime; 
import org.springframework.data.domain.Auditable; 

import javax.persistence.*; 
import java.util.Date; 
import java.util.HashSet; 
import java.util.Set; 

import static javax.persistence.GenerationType.IDENTITY; 


@Table(name = "CONTACT_AUDIT") 
@Entity 
public class ContactAudit implements Auditable<String, Long>{ 
    private Long id; 
    private String firstName; 
    private String lastName; 
    private Date birthDate; 
    private int version; 

    private Set<Hobby> hobbies = new HashSet<Hobby>(); 
    private Set<ContactTelDetail> contactTelDetails = new HashSet<ContactTelDetail>(); 

    //Audit fields 
    private String createdBy; 
    private DateTime createdDate; 
    private String lastModifiedBy; 
    private DateTime lastModifiedDate; 

    //constructors 
    public ContactAudit() { 
    } 

    public ContactAudit(String firstName, String lastName) { 
     this.firstName = firstName; 
     this.lastName = lastName; 
    } 

    public ContactAudit(String firstName, String lastName, Date birthDate, Set<Hobby> hobbies, Set<ContactTelDetail> contactTelDetails) { 
     this.firstName = firstName; 
     this.lastName = lastName; 
     this.birthDate = birthDate; 
     this.hobbies = hobbies; 
     this.contactTelDetails = contactTelDetails; 
    } 

    @Column(name = "ID") 
    @Id 
    @GeneratedValue(strategy = IDENTITY) 
    public Long getId() { 
     return id; 
    } 

    @Override 
    @Transient 
    public boolean isNew() { 
     if (id == null) 
      return true; 
     else 
      return false; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    @Column(name = "FIRST_NAME") 
    public String getFirstName() { 
     return firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    @Column(name = "LAST_NAME") 
    public String getLastName() { 
     return lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    @Column(name = "BIRTH_DATE") 
    @Temporal(TemporalType.DATE) 
    public Date getBirthDate() { 
     return birthDate; 
    } 

    public void setBirthDate(Date birthDate) { 
     this.birthDate = birthDate; 
    } 

    @Column(name = "VERSION") 
    @Version 
    public int getVersion() { 
     return version; 
    } 

    public void setVersion(int version) { 
     this.version = version; 
    } 

    @ManyToMany 
    @JoinTable(name = "contact_hobby_detail", 
      joinColumns = @JoinColumn(name = "CONTACT_ID"), 
      inverseJoinColumns = @JoinColumn(name = "HOBBY_ID")) 
    public Set<Hobby> getHobbies() { 
     return hobbies; 
    } 

    public void setHobbies(Set<Hobby> hobbies) { 
     this.hobbies = hobbies; 
    } 

    @OneToMany(mappedBy = "contact", cascade = CascadeType.ALL, orphanRemoval = true) 
    public Set<ContactTelDetail> getContactTelDetails() { 
     return contactTelDetails; 
    } 

    public void setContactTelDetails(Set<ContactTelDetail> contactTelDetails) { 
     this.contactTelDetails = contactTelDetails; 
    } 

    @Column(name = "CREATED_BY") 
    public String getCreatedBy() { 
     return createdBy; 
    } 

    public void setCreatedBy(String createdBy) { 
     this.createdBy = createdBy; 
    } 

    @Column(name = "CREATED_DATE") 
    @Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime") 
    public DateTime getCreatedDate() { 
     return createdDate; 
    } 

    public void setCreatedDate(DateTime createdDate) { 
     this.createdDate = createdDate; 
    } 

    @Column(name = "LAST_MODIFIED_BY") 
    public String getLastModifiedBy() { 
     return lastModifiedBy; 
    } 

    public void setLastModifiedBy(String lastModifiedBy) { 
     this.lastModifiedBy = lastModifiedBy; 
    } 

    @Column(name = "LAST_MODIFIED_DATE") 
    @Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime") 
    public DateTime getLastModifiedDate() { 
     return lastModifiedDate; 
    } 

    public void setLastModifiedDate(DateTime lastModifiedDate) { 
     this.lastModifiedDate = lastModifiedDate; 
    } 

    //other methods 
    public String toString() 
    { 
     return "Contact - Id: " + id + ", First name: " + firstName + ", Last name: " + lastName + ", Birthday: " + birthDate 
       + ", Create by: " + createdBy + ", Create date: " + createdDate + ", Modified by: " + lastModifiedBy + ", Modifed date: " + lastModifiedDate; 

    } 

} 

SRC/메인/자바/foo는/바/저장소/ContactAuditRepository.java :

package foo.bar.repository; 

import foo.bar.domain.ContactAudit; 
import org.springframework.data.repository.CrudRepository; 


public interface ContactAuditRepository extends CrudRepository<ContactAudit, Long>{ 
} 

SRC/메인/자바/foo는/바/서비스/ContactAuditService.java :

package foo.bar.service; 

import foo.bar.domain.ContactAudit; 

import java.util.List; 


public interface ContactAuditService { 

    public List<ContactAudit> findAll(); 

    public ContactAudit findById(Long id); 

    public ContactAudit save(ContactAudit contact); 
} 

SRC/메인/자바/foo는/바/서비스/SpringJPA이/ContactAuditServiceImpl.java

package foo.bar.service.springjpa; 

import com.google.common.collect.Lists; 
import foo.bar.domain.ContactAudit; 
import foo.bar.repository.ContactAuditRepository; 
import foo.bar.service.ContactAuditService; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Repository; 
import org.springframework.stereotype.Service; 
import org.springframework.transaction.annotation.Transactional; 

import java.util.List; 


@Service("contactAuditService") 
@Repository 
@Transactional 
public class ContactAuditServiceImpl implements ContactAuditService{ 

    @Autowired 
    private ContactAuditRepository contactAuditRepository; 

    @Override 
    @Transactional(readOnly = true) 
    public List<ContactAudit> findAll() { 
     return Lists.newArrayList(contactAuditRepository.findAll()); 
    } 

    @Override 
    @Transactional(readOnly = true) 
    public ContactAudit findById(Long id) { 
     return contactAuditRepository.findOne(id); 
    } 

    @Override 
    public ContactAudit save(ContactAudit contact) { 
     return contactAuditRepository.save(contact); 
    } 
} 

SRC/메인/자바/foo는/바/SpringJPA과/감사/AuditorAwareBean.java :

package foo.bar.springjpa.auditor; 

import org.springframework.data.domain.AuditorAware; 


public class AuditorAwareBean implements AuditorAware<String>{ 
    @Override 
    public String getCurrentAuditor() { 
     return "prospring3"; 
    } 
} 

SRC/메인/자원/봄-config.xml 파일 :

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" 
     xmlns:jpa="http://www.springframework.org/schema/data/jpa" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd"> 
    <context:annotation-config /> 
    <context:component-scan base-package="foo.bar.service.springjpa"/> 


    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
     <property name="driverClassName"> 
      <value>${jdbc.driverClassName}</value> 
     </property> 
     <property name="url"> 
      <value>${jdbc.url}</value> 
     </property> 
     <property name="username"> 
      <value>${jdbc.username}</value> 
     </property> 
     <property name="password"> 
      <value>${jdbc.password}</value> 
     </property> 
    </bean> 

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="emf"/> 
    </bean> 

    <tx:annotation-driven transaction-manager="transactionManager"/> 

    <bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="dataSource" ref="dataSource"/> 
     <property name="jpaVendorAdapter"> 
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/> 
     </property> 
     <property name="packagesToScan" value="foo.bar.domain"/> 
     <property name="jpaProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
       <prop key="hibernate.max_fetch_depth">3</prop> 
       <prop key="hibernate.jdbc.fetch_size">50</prop> 
       <prop key="hibernate.jdbc.batch_size">10</prop> 
       <prop key="hibernate.show_sql">true</prop> 
      </props> 
     </property> 
    </bean> 

    <context:property-placeholder location="jdbc.properties"/> 

    <jpa:repositories base-package="foo.bar.repository" 
         entity-manager-factory-ref="emf" 
         transaction-manager-ref="transactionManager"/> 

    <jpa:auditing auditor-aware-ref="auditorAwareBean"/> 

    <bean id="auditorAwareBean" class="foo.bar.springjpa.auditor.AuditorAwareBean"/> 
</beans> 

src/main/java/META-INF/persistence.xml :

<?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0"> 

    <persistence-unit name="NewPersistenceUnit"/> 

</persistence> 

RC/주/자바/META-INF/orm.xml :

<?xml version="1.0" encoding="UTF-8" ?> 
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_2_0.xsd" 
     version="2.0"> 

    <description>JPA</description> 

    <persistence-unit-metadata> 
     <persistence-unit-defaults> 
      <entity-listeners> 
       <entity-listener class="org.springframework.data.jpa.domain.support.AuditingEntityListener"/> 
      </entity-listeners> 
     </persistence-unit-defaults> 
    </persistence-unit-metadata> 

</entity-mappings> 

-> 그리고 응용 프로그램의 시작점

SRC/메인/자바/foo는/바/SpringJpaAuditSample.java :

package foo.bar; 

import foo.bar.domain.ContactAudit; 
import foo.bar.service.ContactAuditService; 
import org.springframework.context.support.GenericXmlApplicationContext; 

import java.util.Date; 
import java.util.List; 


public class SpringJpaAuditSample { 

    public static void main(String[] args) { 
     GenericXmlApplicationContext ctx = new GenericXmlApplicationContext("spring-config.xml"); 

     ContactAuditService contactService = ctx.getBean("contactAuditService", ContactAuditService.class); 

     List<ContactAudit> contacts = contactService.findAll(); 
     listContacts(contacts); 

     //Add new contact 
     System.out.println("Add new contact"); 
     ContactAudit contact = new ContactAudit(); 
     contact.setFirstName("Michael"); 
     contact.setLastName("Jackson"); 
     contact.setBirthDate(new Date()); 
     contactService.save(contact); 

     contacts = contactService.findAll(); 
     listContacts(contacts); 
    } 

    private static void listContacts(List<ContactAudit> contacts) 
    { 
     System.out.println(""); 
     System.out.println("Listing contacts without details:"); 
     for(ContactAudit contact: contacts) 
     { 
      System.out.println(contact); 
      System.out.println(); 
     } 
    } 
} 

은 findall은이를 반환

Listing contacts without details: 
Contact - Id: 4, First name: Michael, Last name: Jackson, Birthday: 2013-05-27, Create by: null, Create date: 2013-05-27T04:02:36.000+03:00, Modified by: null, Modifed date: 2013-05-27T04:02:36.000+03:00 

내가 대신 문자열 'prospring3'null이 얻을 것을 의미합니다.

아이디어가 있으십니까? 감사합니다.

답변

1

IntelliJ Idea로 만든이 프로젝트에서 '오류'는 IDE가 META-INF 디렉토리를 만들 때마다 내가 선택한 곳이라면 저자가 리소스 디렉토리에 배치했음을 알지 못한다는 것입니다. 이 수정 프로그램에 대한 동기가이 게시물 ("No Persistence Unit Found" error)에서 나옵니다.

관련 문제