Spring CrudRepository with JPA example
Step 1: Add the jar dependency to your maven pom.xml file.
..
<spring.data.version>1.2.0.RELEASE</spring.data.version>
...
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>${spring.data.version}</version>
Step 2: Define the JPA entity -- that is your model class that maps to the table in the database.
package com.mydomain.model;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;
import javax.persistence.Transient;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import org.hibernate.annotations.Type;
import org.springframework.data.jpa.domain.AbstractPersistable;
@Entity
@Table(name = "ReportStructure")
public class Node extends AbstractPersistable<Long>
{
private static final long serialVersionUID = 1L;
@ManyToOne
@JoinColumn(name = "ParentId", insertable = false, updatable = false)
private Node parent;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "ParentId", nullable = false)
private List<Node> children = new ArrayList<Node>();
@OneToOne(cascade = CascadeType.ALL)
@PrimaryKeyJoinColumn
private NodeAttributes attributes;
@ManyToOne(cascade = CascadeType.ALL, optional = false)
@JoinColumn(name = "KeyId")
private NodeKey key;
@Column(name = "InactiveFlag", nullable = false, length = 1)
@Type(type = "yes_no")
private boolean isSoftDeleted;
public Node()
{
this(null);
}
public Node(Long id)
{
this.setId(id);
}
public List<Node> getChildren()
{
return children;
}
public Node getParent()
{
return parent;
}
public void setParent(Node parent)
{
this.parent = parent;
if (parent != null)
{
parent.addChild(this);
}
}
public void setChildren(List<Node> children)
{
this.children = children;
}
public void addChild(Node child)
{
if (child == null)
{
return;
}
if (!children.contains(child))
{
children.add(child);
synchronized (this)
{
if (child.parent == null)
{
child.setParent(this);
}
}
}
}
public NodeKey getKey()
{
return key;
}
public void setKey(NodeKey key)
{
this.key = key;
}
public NodeAttributes getAttributes()
{
return attributes;
}
public void setAttributes(NodeAttributes attributes)
{
this.attributes = attributes;
this.attributes.setNode(this);
}
public boolean isSoftDeleted()
{
return isSoftDeleted;
}
public void setSoftDeleted(boolean isSoftDeleted)
{
this.isSoftDeleted = isSoftDeleted;
}
@Override
public int hashCode()
{
return new HashCodeBuilder().append(key).append(parent).append(attributes).toHashCode();
}
@Override
public boolean equals(final Object obj)
{
if (obj instanceof Node)
{
final Node other = (Node) obj;
return new EqualsBuilder().append(key, other.getKey()).append(parent, other.getParent())
.append(attributes, other.getAttributes()).isEquals();
}
return false;
}
@Override
public String toString()
{
return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
}
}
Step 3: Define the CRUD reposotory by extending Spring's CrudRepository class. The CrudRepository gives you out of the box access to the following standard methods- delete(T entity) which deletes the entity given as a parameter.
- findAll() which returns a list of entities.
- findOne(ID id) which returns the entity using the id given a parameter as a search criteria.
- save(T entity) which saves the entity given as a parameter.
You can provide additional custom methods as shown below,
package com.mydomain.model.impl
import com.mydomain.model.Node;
import com.mydomain.model.NodeKey;
import java.util.Date;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
public interface NodeRepository extends CrudRepository<Node, Long>
{
@Query("SELECT n from Node n JOIN n.key k WITH k.clientId = ?1 and k.evalDate = ?2 "
+ "WHERE n.parent is null and n.isSoftDeleted = false ")
List<Node> find(String clientId, Date evalDate);
@Query("SELECT n from Node n JOIN n.key k WITH k.clientId = :clientId and k.evalDate = :evalDate "
+ "WHERE n.attributes.code = :code and n.isSoftDeleted = false ")
List<Node> find(@Param("clientId") String clientId, @Param("evalDate") Date evalDate,
@Param("code") String code);
@Query("SELECT key from NodeKey key where key.isSoftDeleted = false")
List<NodeKey> findNodeKey();
@Query("SELECT key from NodeKey key WHERE key.clientId = ?1 and key.isSoftDeleted = false")
List<NodeKey> fetch(String clientId);
}
Step 4: The Spring config file to wire up JPA. This example uses HSQL.
<!-- Directory to scan for repository classes -->
<jpa:repositories
base-package="com.mydomain.model" />
<bean class="org.springframework.orm.jpa.JpaTransactionManager"
id="transactionManager">
<property name="entityManagerFactory"
ref="entityManagerFactory" />
<property name="jpaDialect">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
</property>
</bean>
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="generateDdl" value="true" />
<property name="database" value="HSQL" />
</bean>
</property>
</bean>
Step 5: Use the NodeRepository for CRUD operations in the service layer.
public class ReportServiceImpl extends ReportService {
@Autowired
NodeRepository nodeRepository;
...
}
Labels: Spring, Spring JDBC

0 Comments:
Post a Comment
Subscribe to Post Comments [Atom]
<< Home