1 /*
2 * Copyright 2006-2007 the original author or authors.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 package org.springframework.batch.core;
18
19 import java.io.Serializable;
20
21 import org.springframework.util.ClassUtils;
22
23 /**
24 * Batch Domain Entity class. Any class that should be uniquely identifiable
25 * from another should subclass from Entity. More information on this pattern
26 * and the difference between Entities and Value Objects can be found in Domain
27 * Driven Design by Eric Evans.
28 *
29 * @author Lucas Ward
30 * @author Dave Syer
31 *
32 */
33 public class Entity implements Serializable {
34
35 private Long id;
36
37 private volatile Integer version;
38
39 public Entity() {
40 super();
41 }
42
43 public Entity(Long id) {
44 super();
45
46 //Commented out because StepExecutions are still created in a disconnected
47 //manner. The Repository should create them, then this can be uncommented.
48 //Assert.notNull(id, "Entity id must not be null.");
49 this.id = id;
50 }
51
52 public Long getId() {
53 return id;
54 }
55
56 public void setId(Long id) {
57 this.id = id;
58 }
59
60 /**
61 * @return the version
62 */
63 public Integer getVersion() {
64 return version;
65 }
66
67 /**
68 * Public setter for the version needed only by repository methods.
69 * @param version the version to set
70 */
71 public void setVersion(Integer version) {
72 this.version = version;
73 }
74
75 /**
76 * Increment the version number
77 */
78 public void incrementVersion() {
79 if (version == null) {
80 version = 0;
81 } else {
82 version = version + 1;
83 }
84 }
85
86 @Override
87 public String toString() {
88 return String.format("%s: id=%d, version=%d", ClassUtils.getShortName(getClass()), id, version);
89 }
90
91 /**
92 * Attempt to establish identity based on id if both exist. If either id
93 * does not exist use Object.equals().
94 *
95 * @see java.lang.Object#equals(java.lang.Object)
96 */
97 @Override
98 public boolean equals(Object other) {
99 if (other == this) {
100 return true;
101 }
102 if (other == null) {
103 return false;
104 }
105 if (!(other instanceof Entity)) {
106 return false;
107 }
108 Entity entity = (Entity) other;
109 if (id == null || entity.getId() == null) {
110 return false;
111 }
112 return id.equals(entity.getId());
113 }
114
115 /**
116 * Use ID if it exists to establish hash code, otherwise fall back to
117 * Object.hashCode(). Based on the same information as equals, so if that
118 * changes, this will. N.B. this follows the contract of Object.hashCode(),
119 * but will cause problems for anyone adding an unsaved {@link Entity} to a
120 * Set because Set.contains() will almost certainly return false for the
121 * {@link Entity} after it is saved. Spring Batch does not store any of its
122 * entities in Sets as a matter of course, so internally this is consistent.
123 * Clients should not be exposed to unsaved entities.
124 *
125 * @see java.lang.Object#hashCode()
126 */
127 public int hashCode() {
128 if (id == null) {
129 return super.hashCode();
130 }
131 return 39 + 87 * id.hashCode();
132 }
133
134 }