Errata for Patterns of Enterprise Application Architecture

As usual, despite the best care of myself (and the copy editors) some errors always manage to get through. Most of these errors are grammatical typos, which I confess I'm hopeless at spotting. I've highlighted those that I think risk causing serious confusion. My heartfelt apologies for those, and here is a list of the errors I know about

Errors in 19th and later printings

Page 121: In the class diagram, the method "calculateRecognitions" on class Product should read "calculateRevenueRecognitions" (in order to be consistent with the code on page 123.

Page 156: In the code examples for PersonGateway.update() and insert(), the method getID() is being used but it's not clear where getID() is coming from. The ID would be stored in a Layer Supertype for Row Data Gateways [Cannot be fixed in reprints]

Page 201: In the sixth paragraph, "These problem don't hit" should read "These problems don't hit"

Page 201: In the second paragraph, "a legal value field value" should read "a legal value field value"

Page 206: In the last code example, the heading "class Domain Object" should read "class DomainObject" (no space)

Page 211: In the third paragraph "… a loading function than can be supplied …" should read "… a loading function that can be supplied …"

Page 259: In the fourth line of the first text paragraph "If it not I load…" should read "If not, I load…"

Page 357: In the third bullet point "(the number of balls he faced divided by the runs he scored)" should read the other way around: "(the runs he scored divided by the number of balls he faced)"

Page 374: In the second code example the line album = Album.findNamed("1234"); should be removed.

Page 389: First sentance under "How it Works". "Remote Facade tackles the distribution problem which the standard OO approach..." should read "Remote Facade tackles the distribution problem with the standard OO approach..."

Page 429: last but one line. "access to the lock table must by serialized" should read "access to the lock table must be serialized"

Page 432: In the create table line of code ownerid bigint should read ownerid varchar

Page 494: The allocate algorithms shown only work with postive monies. I leave the solution for negative monies as an exercise for the reader. [Cannot be fixed in reprints]

Errors in the 16th thru 19th printing

Page 21: On line 5 "there is no a human being" should read "there is no a human being". [Corrected in the 19th printing]

Page 121: In the class diagram, the method "calculateRecognitions" on class Product should read "calculateRevenueRecognitions" (in order to be consistent with the code on page 123.

Page 156: In the code examples for PersonGateway.update() and insert(), the method getID() is being used but it's not clear where getID() is coming from. The ID would be stored in a Layer Supertype for Row Data Gateways [Cannot be fixed in reprints]

Page 192: Last text paragraph, "Now we can now" should read "Now we can now" [Corrected in the 19th printing]

Page 201: In the sixth paragraph, "These problem don't hit" should read "These problems don't hit"

Page 201: In the second paragraph, "a legal value field value" should read "a legal value field value"

Page 206: In the last code example, the heading "class Domain Object" should read "class DomainObject" (no space)

Page 211: In the third paragraph "… a loading function than can be supplied …" should read "… a loading function that can be supplied …"

Page 259: In the fourth line of the first text paragraph "If it not I load…" should read "If not, I load…"

Page 357: In the third bullet point "(the number of balls he faced divided by the runs he scored)" should read the other way around: "(the runs he scored divided by the number of balls he faced)"

Page 371: First sentance in example section. "This approach to a Two Step View uses a two-stage XLST transformation" should read "This approach to a Two Step View uses a two-stage XSLT transformation" [Corrected in the 19th printing]

Page 374: In the second code example the line album = Album.findNamed("1234"); should be removed.

Page 389: First sentance under "How it Works". "Remote Facade tackles the distribution problem which the standard OO approach..." should read "Remote Facade tackles the distribution problem with the standard OO approach..."

Page 423: Last code block, first line class class AbstractMapper... should read class class AbstractMapper... [Corrected in the 19th printing]

Page 429: last but one line. "access to the lock table must by serialized" should read "access to the lock table must be serialized"

Page 432: In code block class ExclusiveReadLockManagerDBImpl implements ExclusiveLockManager... should read class ExclusiveReadLockManagerDBImpl implements ExclusiveReadLockManager [Corrected in the 19th printing]

Page 432: In the create table line of code ownerid bigint should read ownerid varchar

Page 494: The allocate algorithms shown only work with postive monies. I leave the solution for negative monies as an exercise for the reader. [Cannot be fixed in reprints]

Errors in the 13th thru 16th printing

Page 21: On line 5 "there is no a human being" should read "there is no a human being". [Corrected in the 19th printing]

Page 121: In the class diagram, the method "calculateRecognitions" on class Product should read "calculateRevenueRecognitions" (in order to be consistent with the code on page 123.

Page 156: In the code examples for PersonGateway.update() and insert(), the method getID() is being used but it's not clear where getID() is coming from. The ID would be stored in a Layer Supertype for Row Data Gateways [Cannot be fixed in reprints]

Page 192: Last text paragraph, "Now we can now" should read "Now we can now" [Corrected in the 19th printing]

Page 201: In the sixth paragraph, "These problem don't hit" should read "These problems don't hit"

Page 201: In the second paragraph, "a legal value field value" should read "a legal value field value"

Page 206: In the last code example, the heading "class Domain Object" should read "class DomainObject" (no space)

Page 211: In the third paragraph "… a loading function than can be supplied …" should read "… a loading function that can be supplied …"

Page 238: Fourth paragraph, last sentance. "diff with the database is you're using" should read "diff with the database if you're using" [Corrected in the 16th printing]

Page 259: In the fourth line of the first text paragraph "If it not I load…" should read "If not, I load…"

Page 279: Start of last paragraph "Rremember" should be "Remember" [Corrected in the 16th printing]

Page 294: At the end of the second paragraph "Thus, you thus need a key" is over-thused [Corrected in the 16th printing]

Page 357: In the third bullet point "(the number of balls he faced divided by the runs he scored)" should read the other way around: "(the runs he scored divided by the number of balls he faced)"

Page 371: First sentance in example section. "This approach to a Two Step View uses a two-stage XLST transformation" should read "This approach to a Two Step View uses a two-stage XSLT transformation" [Corrected in the 19th printing]

Page 374: In the second code example the line album = Album.findNamed("1234"); should be removed.

Page 380: In the first paragraph, first sentance. "the view with which display the response" should read "the view with which to display the response" [Corrected in the 16th printing]

Page 389: First sentance under "How it Works". "Remote Facade tackles the distribution problem which the standard OO approach..." should read "Remote Facade tackles the distribution problem with the standard OO approach..."

Page 412: Second sentance has spurious words: "I write methods to read and write an XML element to represent that class each Data Transfer Object class." [Corrected in the 16th printing]

Page 423: Last code block, first line class class AbstractMapper... should read class class AbstractMapper... [Corrected in the 19th printing]

Page 423: In the code example at the bottom of the page we need to insert another line of code. After the line stmt.setLong(1,object.getId().longValue()); add the line stmt.setInt(2, object.getVersion() + 1); [Corrected in the 16th printing]

Page 429: last but one line. "access to the lock table must by serialized" should read "access to the lock table must be serialized"

Page 432: In code block class ExclusiveReadLockManagerDBImpl implements ExclusiveLockManager... should read class ExclusiveReadLockManagerDBImpl implements ExclusiveReadLockManager [Corrected in the 19th printing]

Page 432: In the create table line of code ownerid bigint should read ownerid varchar

Page 494: The allocate algorithms shown only work with postive monies. I leave the solution for negative monies as an exercise for the reader. [Cannot be fixed in reprints]

Errors in the 10th thru 13th printing

Page 21: On line 5 "there is no a human being" should read "there is no a human being". [Corrected in the 19th printing]

Page 21: Top line: "would be particularly for communication with existing packages" should read "would be particularly common for communication with existing packages" [Corrected in the 13th printing]

Page 121: In the class diagram, the method "calculateRecognitions" on class Product should read "calculateRevenueRecognitions" (in order to be consistent with the code on page 123.

Page 156: In the code examples for PersonGateway.update() and insert(), the method getID() is being used but it's not clear where getID() is coming from. The ID would be stored in a Layer Supertype for Row Data Gateways [Cannot be fixed in reprints]

Page 192: Last text paragraph, "Now we can now" should read "Now we can now" [Corrected in the 19th printing]

Page 201: In the sixth paragraph, "These problem don't hit" should read "These problems don't hit"

Page 201: In the second paragraph, "a legal value field value" should read "a legal value field value"

Page 206: In the last code example, the heading "class Domain Object" should read "class DomainObject" (no space)

Page 211: In the third paragraph "… a loading function than can be supplied …" should read "… a loading function that can be supplied …"

Page 238: Fourth paragraph, last sentance. "diff with the database is you're using" should read "diff with the database if you're using" [Corrected in the 16th printing]

Page 259: In the fourth line of the first text paragraph "If it not I load…" should read "If not, I load…"

Page 279: Start of last paragraph "Rremember" should be "Remember" [Corrected in the 16th printing]

Page 294: At the end of the second paragraph "Thus, you thus need a key" is over-thused [Corrected in the 16th printing]

Page 357: In the third bullet point "(the number of balls he faced divided by the runs he scored)" should read the other way around: "(the runs he scored divided by the number of balls he faced)"

Page 371: First sentance in example section. "This approach to a Two Step View uses a two-stage XLST transformation" should read "This approach to a Two Step View uses a two-stage XSLT transformation" [Corrected in the 19th printing]

Page 374: In the second code example the line album = Album.findNamed("1234"); should be removed.

Page 380: In the first paragraph, first sentance. "the view with which display the response" should read "the view with which to display the response" [Corrected in the 16th printing]

Page 389: First sentance under "How it Works". "Remote Facade tackles the distribution problem which the standard OO approach..." should read "Remote Facade tackles the distribution problem with the standard OO approach..."

Page 412: Second sentance has spurious words: "I write methods to read and write an XML element to represent that class each Data Transfer Object class." [Corrected in the 16th printing]

Page 423: Last code block, first line class class AbstractMapper... should read class class AbstractMapper... [Corrected in the 19th printing]

Page 423: In the code example at the bottom of the page we need to insert another line of code. After the line stmt.setLong(1,object.getId().longValue()); add the line stmt.setInt(2, object.getVersion() + 1); [Corrected in the 16th printing]

Page 429: last but one line. "access to the lock table must by serialized" should read "access to the lock table must be serialized"

Page 432: In code block class ExclusiveReadLockManagerDBImpl implements ExclusiveLockManager... should read class ExclusiveReadLockManagerDBImpl implements ExclusiveReadLockManager [Corrected in the 19th printing]

Page 432: In the create table line of code ownerid bigint should read ownerid varchar

Page 494: The allocate algorithms shown only work with postive monies. I leave the solution for negative monies as an exercise for the reader. [Cannot be fixed in reprints]

Errors in the 9th printing

Page 21: On line 5 "there is no a human being" should read "there is no a human being". [Corrected in the 19th printing]

Page 21: Top line: "would be particularly for communication with existing packages" should read "would be particularly common for communication with existing packages" [Corrected in the 13th printing]

Page 121: In the class diagram, the method "calculateRecognitions" on class Product should read "calculateRevenueRecognitions" (in order to be consistent with the code on page 123.

Page 156: In the code examples for PersonGateway.update() and insert(), the method getID() is being used but it's not clear where getID() is coming from. The ID would be stored in a Layer Supertype for Row Data Gateways [Cannot be fixed in reprints]

Page 192: Last text paragraph, "Now we can now" should read "Now we can now" [Corrected in the 19th printing]

Page 201: In the sixth paragraph, "These problem don't hit" should read "These problems don't hit"

Page 201: In the second paragraph, "a legal value field value" should read "a legal value field value"

Page 206: In the last code example, the heading "class Domain Object" should read "class DomainObject" (no space)

Page 207: In the first code example, class Domain Object should read class DomainObject (no space). [Corrected in the 10th printing]

Page 211: In the third paragraph "… a loading function than can be supplied …" should read "… a loading function that can be supplied …"

Page 238: Fourth paragraph, last sentance. "diff with the database is you're using" should read "diff with the database if you're using" [Corrected in the 16th printing]

Page 259: In the fourth line of the first text paragraph "If it not I load…" should read "If not, I load…"

Page 279: Start of last paragraph "Rremember" should be "Remember" [Corrected in the 16th printing]

Page 294: At the end of the second paragraph "Thus, you thus need a key" is over-thused [Corrected in the 16th printing]

Page 357: In the third bullet point "(the number of balls he faced divided by the runs he scored)" should read the other way around: "(the runs he scored divided by the number of balls he faced)"

Page 371: First sentance in example section. "This approach to a Two Step View uses a two-stage XLST transformation" should read "This approach to a Two Step View uses a two-stage XSLT transformation" [Corrected in the 19th printing]

Page 374: In the second code example the line album = Album.findNamed("1234"); should be removed.

Page 380: In the first paragraph, first sentance. "the view with which display the response" should read "the view with which to display the response" [Corrected in the 16th printing]

Page 389: First sentance under "How it Works". "Remote Facade tackles the distribution problem which the standard OO approach..." should read "Remote Facade tackles the distribution problem with the standard OO approach..."

Page 412: Second sentance has spurious words: "I write methods to read and write an XML element to represent that class each Data Transfer Object class." [Corrected in the 16th printing]

Page 423: Last code block, first line class class AbstractMapper... should read class class AbstractMapper... [Corrected in the 19th printing]

Page 423: In the code example at the bottom of the page we need to insert another line of code. After the line stmt.setLong(1,object.getId().longValue()); add the line stmt.setInt(2, object.getVersion() + 1); [Corrected in the 16th printing]

Page 429: last but one line. "access to the lock table must by serialized" should read "access to the lock table must be serialized"

Page 432: In code block class ExclusiveReadLockManagerDBImpl implements ExclusiveLockManager... should read class ExclusiveReadLockManagerDBImpl implements ExclusiveReadLockManager [Corrected in the 19th printing]

Page 432: In the create table line of code ownerid bigint should read ownerid varchar

Page 485: In the last code example the line Person martin = Registry.personFinder().find(1); should read Person martin = f1.find(1); [Corrected in the 10th printing]

Page 494: The allocate algorithms shown only work with postive monies. I leave the solution for negative monies as an exercise for the reader. [Cannot be fixed in reprints]

Page 497: In the last sentence of the second paragraph "you can accumulate charges against an occupant customer even you can't do much billing" should read "you can accumulate charges against an occupant customer even if you can't do much billing" [Corrected in the 10th printing]

Errors in the 8th printing

Page 21: On line 5 "there is no a human being" should read "there is no a human being". [Corrected in the 19th printing]

Page 21: Top line: "would be particularly for communication with existing packages" should read "would be particularly common for communication with existing packages" [Corrected in the 13th printing]

Page 121: In the class diagram, the method "calculateRecognitions" on class Product should read "calculateRevenueRecognitions" (in order to be consistent with the code on page 123.

Page 156: In the code examples for PersonGateway.update() and insert(), the method getID() is being used but it's not clear where getID() is coming from. The ID would be stored in a Layer Supertype for Row Data Gateways [Cannot be fixed in reprints]

Page 192: Last text paragraph, "Now we can now" should read "Now we can now" [Corrected in the 19th printing]

Page 201: In the sixth paragraph, "These problem don't hit" should read "These problems don't hit"

Page 201: In the second paragraph, "a legal value field value" should read "a legal value field value"

Page 206: In the last code example, the heading "class Domain Object" should read "class DomainObject" (no space)

Page 207: In the first code example, class Domain Object should read class DomainObject (no space). [Corrected in the 10th printing]

Page 211: In the third paragraph "… a loading function than can be supplied …" should read "… a loading function that can be supplied …"

Page 238: Fourth paragraph, last sentance. "diff with the database is you're using" should read "diff with the database if you're using" [Corrected in the 16th printing]

Page 259: In the fourth line of the first text paragraph "If it not I load…" should read "If not, I load…"

Page 279: Start of last paragraph "Rremember" should be "Remember" [Corrected in the 16th printing]

Page 294: At the end of the second paragraph "Thus, you thus need a key" is over-thused [Corrected in the 16th printing]

Page 351: Last line of third paragraph. "(providing your HTML is XHMTL..." should read "(providing your HTML is XHTML...". Of course. [Corrected in the 9th printing]

Page 357: In the third bullet point "(the number of balls he faced divided by the runs he scored)" should read the other way around: "(the runs he scored divided by the number of balls he faced)"

Page 371: First sentance in example section. "This approach to a Two Step View uses a two-stage XLST transformation" should read "This approach to a Two Step View uses a two-stage XSLT transformation" [Corrected in the 19th printing]

Page 374: In the second code example the line album = Album.findNamed("1234"); should be removed.

Page 380: In the first paragraph, first sentance. "the view with which display the response" should read "the view with which to display the response" [Corrected in the 16th printing]

Page 389: First sentance under "How it Works". "Remote Facade tackles the distribution problem which the standard OO approach..." should read "Remote Facade tackles the distribution problem with the standard OO approach..."

Page 412: Second sentance has spurious words: "I write methods to read and write an XML element to represent that class each Data Transfer Object class." [Corrected in the 16th printing]

Page 423: Last code block, first line class class AbstractMapper... should read class class AbstractMapper... [Corrected in the 19th printing]

Page 423: In the code example at the bottom of the page we need to insert another line of code. After the line stmt.setLong(1,object.getId().longValue()); add the line stmt.setInt(2, object.getVersion() + 1); [Corrected in the 16th printing]

Page 429: last but one line. "access to the lock table must by serialized" should read "access to the lock table must be serialized"

Page 432: In code block class ExclusiveReadLockManagerDBImpl implements ExclusiveLockManager... should read class ExclusiveReadLockManagerDBImpl implements ExclusiveReadLockManager [Corrected in the 19th printing]

Page 432: In the create table line of code ownerid bigint should read ownerid varchar

Page 436: In the code "class EditCustomerCommand implements Command..." should read "class EditCustomerCommand extends BusinessTransactionCommand...". Similarly "class SaveCustomerCommand implements Command..." should read "class SaveCustomerCommand extends BusinessTransactionCommand...". (A small but awkward gap in my fancy auto import feature.) [Corrected in the 9th printing]

Page 485: In the last code example the line Person martin = Registry.personFinder().find(1); should read Person martin = f1.find(1); [Corrected in the 10th printing]

Page 494: The allocate algorithms shown only work with postive monies. I leave the solution for negative monies as an exercise for the reader. [Cannot be fixed in reprints]

Page 497: In the last sentence of the second paragraph "you can accumulate charges against an occupant customer even you can't do much billing" should read "you can accumulate charges against an occupant customer even if you can't do much billing" [Corrected in the 10th printing]

Errors in the 6th thru 8th printing

Page 21: On line 5 "there is no a human being" should read "there is no a human being". [Corrected in the 19th printing]

Page 21: Top line: "would be particularly for communication with existing packages" should read "would be particularly common for communication with existing packages" [Corrected in the 13th printing]

Page 34: (7th Printing only) In some copies this page is completely blank due to a printing error. If you have this problem, please contact John Fuller at Addison Wesley. [Corrected in the 8th printing]

Page 121: In the class diagram, the method "calculateRecognitions" on class Product should read "calculateRevenueRecognitions" (in order to be consistent with the code on page 123.

Page 156: In the code examples for PersonGateway.update() and insert(), the method getID() is being used but it's not clear where getID() is coming from. The ID would be stored in a Layer Supertype for Row Data Gateways [Cannot be fixed in reprints]

Page 192: Last text paragraph, "Now we can now" should read "Now we can now" [Corrected in the 19th printing]

Page 201: In the sixth paragraph, "These problem don't hit" should read "These problems don't hit"

Page 201: In the second paragraph, "a legal value field value" should read "a legal value field value"

Page 206: In the last code example, the heading "class Domain Object" should read "class DomainObject" (no space)

Page 207: In the first code example, class Domain Object should read class DomainObject (no space). [Corrected in the 10th printing]

Page 211: In the third paragraph "… a loading function than can be supplied …" should read "… a loading function that can be supplied …"

Page 238: Fourth paragraph, last sentance. "diff with the database is you're using" should read "diff with the database if you're using" [Corrected in the 16th printing]

Page 259: In the fourth line of the first text paragraph "If it not I load…" should read "If not, I load…"

Page 279: Start of last paragraph "Rremember" should be "Remember" [Corrected in the 16th printing]

Page 294: At the end of the second paragraph "Thus, you thus need a key" is over-thused [Corrected in the 16th printing]

Page 351: Last line of third paragraph. "(providing your HTML is XHMTL..." should read "(providing your HTML is XHTML...". Of course. [Corrected in the 9th printing]

Page 357: In the third bullet point "(the number of balls he faced divided by the runs he scored)" should read the other way around: "(the runs he scored divided by the number of balls he faced)"

Page 371: First sentance in example section. "This approach to a Two Step View uses a two-stage XLST transformation" should read "This approach to a Two Step View uses a two-stage XSLT transformation" [Corrected in the 19th printing]

Page 374: In the second code example the line album = Album.findNamed("1234"); should be removed.

Page 380: In the first paragraph, first sentance. "the view with which display the response" should read "the view with which to display the response" [Corrected in the 16th printing]

Page 389: First sentance under "How it Works". "Remote Facade tackles the distribution problem which the standard OO approach..." should read "Remote Facade tackles the distribution problem with the standard OO approach..."

Page 412: Second sentance has spurious words: "I write methods to read and write an XML element to represent that class each Data Transfer Object class." [Corrected in the 16th printing]

Page 423: Last code block, first line class class AbstractMapper... should read class class AbstractMapper... [Corrected in the 19th printing]

Page 423: In the code example at the bottom of the page we need to insert another line of code. After the line stmt.setLong(1,object.getId().longValue()); add the line stmt.setInt(2, object.getVersion() + 1); [Corrected in the 16th printing]

Page 429: last but one line. "access to the lock table must by serialized" should read "access to the lock table must be serialized"

Page 432: In code block class ExclusiveReadLockManagerDBImpl implements ExclusiveLockManager... should read class ExclusiveReadLockManagerDBImpl implements ExclusiveReadLockManager [Corrected in the 19th printing]

Page 432: In the create table line of code ownerid bigint should read ownerid varchar

Page 436: In the code "class EditCustomerCommand implements Command..." should read "class EditCustomerCommand extends BusinessTransactionCommand...". Similarly "class SaveCustomerCommand implements Command..." should read "class SaveCustomerCommand extends BusinessTransactionCommand...". (A small but awkward gap in my fancy auto import feature.) [Corrected in the 9th printing]

Page 485: In the last code example the line Person martin = Registry.personFinder().find(1); should read Person martin = f1.find(1); [Corrected in the 10th printing]

Page 494: The allocate algorithms shown only work with postive monies. I leave the solution for negative monies as an exercise for the reader. [Cannot be fixed in reprints]

Page 497: In the last sentence of the second paragraph "you can accumulate charges against an occupant customer even you can't do much billing" should read "you can accumulate charges against an occupant customer even if you can't do much billing" [Corrected in the 10th printing]

Errors in the 5th printing

Page 21: On line 5 "there is no a human being" should read "there is no a human being". [Corrected in the 19th printing]

Page 21: Top line: "would be particularly for communication with existing packages" should read "would be particularly common for communication with existing packages" [Corrected in the 13th printing]

Page 34: (7th Printing only) In some copies this page is completely blank due to a printing error. If you have this problem, please contact John Fuller at Addison Wesley. [Corrected in the 8th printing]

Page 34: On the third line from bottom "you only need a single class for each table" should read "you only need a single object for each table [Corrected in the 6th printing]

Page 66: On the second line "It may consists of a single request" should read "It may consists of a single request" [Corrected in the 6th printing]

Page 67: In the second paragraph, "...arrange things so that the programs enters an isolated zone..." should read "...arrange things so that the programs enters an isolated zone..." [Corrected in the 6th printing]

Page 74: In the fourth paragraph "You have to decide what risks you want take" should read "You have to decide what risks you want to take" [Corrected in the 6th printing]

Page 76: In the second paragraph, 3rd line: "...business transaction not leave the record..." should read "...business transaction does not leave the record..." [Corrected in the 6th printing]

Page 118: In the third paragraph of Java Implementation "Entity beans can't be re-entrant..." should read "Entity beans shouldn't be re-entrant...". (While you can make entity beans re-entrant, to do so exposes you to some dangerous concurrency problems.) [Corrected in the 6th printing]

Page 121: In the class diagram, the method "calculateRecognitions" on class Product should read "calculateRevenueRecognitions" (in order to be consistent with the code on page 123.

Page 156: In the code examples for PersonGateway.update() and insert(), the method getID() is being used but it's not clear where getID() is coming from. The ID would be stored in a Layer Supertype for Row Data Gateways [Cannot be fixed in reprints]

Page 192: Last text paragraph, "Now we can now" should read "Now we can now" [Corrected in the 19th printing]

Page 201: In the sixth paragraph, "These problem don't hit" should read "These problems don't hit"

Page 201: In the second paragraph, "a legal value field value" should read "a legal value field value"

Page 206: In the last code example, the heading "class Domain Object" should read "class DomainObject" (no space)

Page 207: In the first code example, class Domain Object should read class DomainObject (no space). [Corrected in the 10th printing]

Page 211: In the third paragraph "… a loading function than can be supplied …" should read "… a loading function that can be supplied …"

Page 238: Fourth paragraph, last sentance. "diff with the database is you're using" should read "diff with the database if you're using" [Corrected in the 16th printing]

Page 259: In the fourth line of the first text paragraph "If it not I load…" should read "If not, I load…"

Page 279: Start of last paragraph "Rremember" should be "Remember" [Corrected in the 16th printing]

Page 291: The first code example in the page shows the Update method on class Mapper.

		
    public virtual void Update (DomainObject arg) {
			Save (arg);
		}
This is the wrong code fragment. Instead it should read
		public virtual long Insert (DomainObject obj) {
			obj.Id = GetNextID();
			AddRow(obj);
			Save(obj);
			return obj.Id;
		}
Automatic code import is wonderful, but I still have to import the correct fragment! [Corrected in the 6th printing]

Page 294: At the end of the second paragraph "Thus, you thus need a key" is over-thused [Corrected in the 16th printing]

Page 326: In code sample for PersonRepository the line

public List dependentsOf(aPerson) {
should read
public List  dependentsOf(Person aPerson) {
(The 5th printing fixed this but introduced a different error, repeating List :-( [Corrected in the 6th printing]

Page 351: Last line of third paragraph. "(providing your HTML is XHMTL..." should read "(providing your HTML is XHTML...". Of course. [Corrected in the 9th printing]

Page 357: In the third bullet point "(the number of balls he faced divided by the runs he scored)" should read the other way around: "(the runs he scored divided by the number of balls he faced)"

Page 371: First sentance in example section. "This approach to a Two Step View uses a two-stage XLST transformation" should read "This approach to a Two Step View uses a two-stage XSLT transformation" [Corrected in the 19th printing]

Page 374: In the second code example the line album = Album.findNamed("1234"); should be removed.

Page 380: In the first paragraph, first sentance. "the view with which display the response" should read "the view with which to display the response" [Corrected in the 16th printing]

Page 389: First sentance under "How it Works". "Remote Facade tackles the distribution problem which the standard OO approach..." should read "Remote Facade tackles the distribution problem with the standard OO approach..."

Page 412: Second sentance has spurious words: "I write methods to read and write an XML element to represent that class each Data Transfer Object class." [Corrected in the 16th printing]

Page 423: Last code block, first line class class AbstractMapper... should read class class AbstractMapper... [Corrected in the 19th printing]

Page 423: In the code example at the bottom of the page we need to insert another line of code. After the line stmt.setLong(1,object.getId().longValue()); add the line stmt.setInt(2, object.getVersion() + 1); [Corrected in the 16th printing]

Page 429: last but one line. "access to the lock table must by serialized" should read "access to the lock table must be serialized"

Page 432: In code block class ExclusiveReadLockManagerDBImpl implements ExclusiveLockManager... should read class ExclusiveReadLockManagerDBImpl implements ExclusiveReadLockManager [Corrected in the 19th printing]

Page 432: In the create table line of code ownerid bigint should read ownerid varchar

Page 436: In the code "class EditCustomerCommand implements Command..." should read "class EditCustomerCommand extends BusinessTransactionCommand...". Similarly "class SaveCustomerCommand implements Command..." should read "class SaveCustomerCommand extends BusinessTransactionCommand...". (A small but awkward gap in my fancy auto import feature.) [Corrected in the 9th printing]

Page 485: In the last code example the line Person martin = Registry.personFinder().find(1); should read Person martin = f1.find(1); [Corrected in the 10th printing]

Page 494: The allocate algorithms shown only work with postive monies. I leave the solution for negative monies as an exercise for the reader. [Cannot be fixed in reprints]

Page 497: In the last sentence of the second paragraph "you can accumulate charges against an occupant customer even you can't do much billing" should read "you can accumulate charges against an occupant customer even if you can't do much billing" [Corrected in the 10th printing]

Errors in the 4th printing

Page tabs: On the whole the tabs on the edge of pages work well. However from page 426 onward all the tabs got shifted up a notch, which sadly spoils the effect. [Corrected in the 5th printing]

Page 9: In the second paragraph there are a couple of spots where Swordfish and Camel aren't capitalized. [Corrected in the 5th printing]

Page 17: The last sentence of the second paragraph is missing its close parenthesis. [Corrected in the 5th printing]

Page 21: On line 5 "there is no a human being" should read "there is no a human being". [Corrected in the 19th printing]

Page 21: Top line: "would be particularly for communication with existing packages" should read "would be particularly common for communication with existing packages" [Corrected in the 13th printing]

Page 24: In the second to last paragraph "... try to keep all the code..." should read "... try to keep all of a node's code..." [Corrected in the 5th printing]

Page 33: In the second to last sentence of the last paragraph, language is misspelled. [Corrected in the 5th printing]

Page 34: (7th Printing only) In some copies this page is completely blank due to a printing error. If you have this problem, please contact John Fuller at Addison Wesley. [Corrected in the 8th printing]

Page 34: On the third line from bottom "you only need a single class for each table" should read "you only need a single object for each table [Corrected in the 6th printing]

Page 44: 3rd sentence of 3rd paragraph, "...linked object as a Embedded Value..." should read "...linked object as an Embedded Value..." [Corrected in the 5th printing]

Page 45: On the last line of the first paragraph of the Inheritance section "hierarchy; Class Table Inheritance" should use a colon instead of a semi-colon. [Corrected in the 5th printing]

Page 52: First sentence of second paragraph "If you do things outside of a transaction..." should read "If you do things outside of your transaction..." Everything that hits a transactional database occurs in some transaction, but sometimes you want things to executed outside of the main transaction that you're focused on. [Corrected in the 5th printing]

Page 66: On the second line "It may consists of a single request" should read "It may consists of a single request" [Corrected in the 6th printing]

Page 67: In the second paragraph, "...arrange things so that the programs enters an isolated zone..." should read "...arrange things so that the programs enters an isolated zone..." [Corrected in the 6th printing]

Page 74: In the fourth paragraph "You have to decide what risks you want take" should read "You have to decide what risks you want to take" [Corrected in the 6th printing]

Page 76: In the second paragraph, 3rd line: "...business transaction not leave the record..." should read "...business transaction does not leave the record..." [Corrected in the 6th printing]

Page 76: In the first paragraph, second sentence "...commit phase of the system transaction, when the user hits Save within a system transaction." should read "...commit phase of the system transaction, when the user hits Save, within a system transaction." (missing comma) [Corrected in the 5th printing]

Page 78: In the last paragraph "The main problem over process-per-session..." should read "The main problem of process for request over process-per-session..." [Corrected in the 5th printing]

Page 83: In the fourth paragraph of Session State "But it's not just changes that are a problem" should read "But it's not just direct changes that are a problem. [Corrected in the 5th printing]

Page 91: On the third line "have to have to pay" should read "have to pay" [Corrected in the 5th printing]

Page 97: At the beginning of the first paragraph of Down to the Data Source Layer, "Once you've chose your domain layer..." should read "Once you've chosen your domain layer..." [Corrected in the 5th printing]

Page 101: In the 6th line of the second paragraph "CMP" should read "Container Managed Persistance (CMP)" [Corrected in the 5th printing]

Page 102: The continuing paragraph at the top is missing its final full stop. [Corrected in the 5th printing]

Page 106: On the fifth line "I tend to look as it..." should read "I tend to look at it..." [Corrected in the 5th printing]

Page 117: In the second sentence of the last paragraph "some of the order behavior is only needed only for it" should read "some of the order behavior is only needed only for it [Corrected in the 5th printing]

Page 118: In the third paragraph of Java Implementation "Entity beans can't be re-entrant..." should read "Entity beans shouldn't be re-entrant...". (While you can make entity beans re-entrant, to do so exposes you to some dangerous concurrency problems.) [Corrected in the 6th printing]

Page 121: In the class diagram, the method "calculateRecognitions" on class Product should read "calculateRevenueRecognitions" (in order to be consistent with the code on page 123.

Page 130: In the paragraph at the middle of the page "updating the revenue recognition tables" should read "updating the revenue recognition tables (incorrect plural). [Corrected in the 5th printing]

Page 156: In the code examples for PersonGateway.update() and insert(), the method getID() is being used but it's not clear where getID() is coming from. The ID would be stored in a Layer Supertype for Row Data Gateways [Cannot be fixed in reprints]

Page 158: In the code block with many calls to append, the last one is missing its last few characters. The line should read

result.append("\n");
[Corrected in the 5th printing]

Page 192: Last text paragraph, "Now we can now" should read "Now we can now" [Corrected in the 19th printing]

Page 201: In the sixth paragraph, "These problem don't hit" should read "These problems don't hit"

Page 201: In the second paragraph, "a legal value field value" should read "a legal value field value"

Page 206: In the last code example, the heading "class Domain Object" should read "class DomainObject" (no space)

Page 207: In the first code example, class Domain Object should read class DomainObject (no space). [Corrected in the 10th printing]

Page 211: In the third paragraph "… a loading function than can be supplied …" should read "… a loading function that can be supplied …"

Page 238: Fourth paragraph, last sentance. "diff with the database is you're using" should read "diff with the database if you're using" [Corrected in the 16th printing]

Page 259: In the fourth line of the first text paragraph "If it not I load…" should read "If not, I load…"

Page 279: Start of last paragraph "Rremember" should be "Remember" [Corrected in the 16th printing]

Page 291: The first code example in the page shows the Update method on class Mapper.

		
    public virtual void Update (DomainObject arg) {
			Save (arg);
		}
This is the wrong code fragment. Instead it should read
		public virtual long Insert (DomainObject obj) {
			obj.Id = GetNextID();
			AddRow(obj);
			Save(obj);
			return obj.Id;
		}
Automatic code import is wonderful, but I still have to import the correct fragment! [Corrected in the 6th printing]

Page 294: At the end of the second paragraph "Thus, you thus need a key" is over-thused [Corrected in the 16th printing]

Page 326: In code sample for PersonRepository the line

public List dependentsOf(aPerson) {
should read
public List  dependentsOf(Person aPerson) {
(The 5th printing fixed this but introduced a different error, repeating List :-( [Corrected in the 6th printing]

Page 326: In the code sample for Repository the line

protected List matching(aCriteria) {
should read
protected List matching(Criteria aCriteria) {
Sadly my contributors weren't able to take advantage of my automatic code import mechanism. [Corrected in the 5th printing]

Page 351: Last line of third paragraph. "(providing your HTML is XHMTL..." should read "(providing your HTML is XHTML...". Of course. [Corrected in the 9th printing]

Page 357: In the third bullet point "(the number of balls he faced divided by the runs he scored)" should read the other way around: "(the runs he scored divided by the number of balls he faced)"

Page 371: First sentance in example section. "This approach to a Two Step View uses a two-stage XLST transformation" should read "This approach to a Two Step View uses a two-stage XSLT transformation" [Corrected in the 19th printing]

Page 374: In the second code example the line album = Album.findNamed("1234"); should be removed.

Page 380: In the first paragraph, first sentance. "the view with which display the response" should read "the view with which to display the response" [Corrected in the 16th printing]

Page 389: First sentance under "How it Works". "Remote Facade tackles the distribution problem which the standard OO approach..." should read "Remote Facade tackles the distribution problem with the standard OO approach..."

Page 412: Second sentance has spurious words: "I write methods to read and write an XML element to represent that class each Data Transfer Object class." [Corrected in the 16th printing]

Page 423: Last code block, first line class class AbstractMapper... should read class class AbstractMapper... [Corrected in the 19th printing]

Page 423: In the code example at the bottom of the page we need to insert another line of code. After the line stmt.setLong(1,object.getId().longValue()); add the line stmt.setInt(2, object.getVersion() + 1); [Corrected in the 16th printing]

Page 429: last but one line. "access to the lock table must by serialized" should read "access to the lock table must be serialized"

Page 432: In code block class ExclusiveReadLockManagerDBImpl implements ExclusiveLockManager... should read class ExclusiveReadLockManagerDBImpl implements ExclusiveReadLockManager [Corrected in the 19th printing]

Page 432: In the create table line of code ownerid bigint should read ownerid varchar

Page 436: In the code "class EditCustomerCommand implements Command..." should read "class EditCustomerCommand extends BusinessTransactionCommand...". Similarly "class SaveCustomerCommand implements Command..." should read "class SaveCustomerCommand extends BusinessTransactionCommand...". (A small but awkward gap in my fancy auto import feature.) [Corrected in the 9th printing]

Page 485: In the last code example the line Person martin = Registry.personFinder().find(1); should read Person martin = f1.find(1); [Corrected in the 10th printing]

Page 494: The allocate algorithms shown only work with postive monies. I leave the solution for negative monies as an exercise for the reader. [Cannot be fixed in reprints]

Page 497: In the last sentence of the second paragraph "you can accumulate charges against an occupant customer even you can't do much billing" should read "you can accumulate charges against an occupant customer even if you can't do much billing" [Corrected in the 10th printing]

Errors in the 3rd printing

Page tabs: On the whole the tabs on the edge of pages work well. However from page 426 onward all the tabs got shifted up a notch, which sadly spoils the effect. [Corrected in the 5th printing]

Page 9: In the second paragraph there are a couple of spots where Swordfish and Camel aren't capitalized. [Corrected in the 5th printing]

Page 17: The last sentence of the second paragraph is missing its close parenthesis. [Corrected in the 5th printing]

Page 21: On line 5 "there is no a human being" should read "there is no a human being". [Corrected in the 19th printing]

Page 21: Top line: "would be particularly for communication with existing packages" should read "would be particularly common for communication with existing packages" [Corrected in the 13th printing]

Page 24: In the second to last paragraph "... try to keep all the code..." should read "... try to keep all of a node's code..." [Corrected in the 5th printing]

Page 33: The first sentence of the second paragraph: "One the biggest reasons" should read "One of the biggest reasons" [Corrected in the 4th printing]

Page 33: In the second to last sentence of the last paragraph, language is misspelled. [Corrected in the 5th printing]

Page 33: In the last sentence of the last paragraph "Database Administrations (DBAs) also like..." should read "Database Administrators (DBAs) also like..." [Corrected in the 4th printing]

Page 34: (7th Printing only) In some copies this page is completely blank due to a printing error. If you have this problem, please contact John Fuller at Addison Wesley. [Corrected in the 8th printing]

Page 34: On the third line from bottom "you only need a single class for each table" should read "you only need a single object for each table [Corrected in the 6th printing]

Page 36: In the second paragraph "All of these forces push you to in'direction" should read "All of these forces push you to indirection" (remove errant apostrophe) [Corrected in the 4th printing]

Page 44: 3rd sentence of 3rd paragraph, "...linked object as a Embedded Value..." should read "...linked object as an Embedded Value..." [Corrected in the 5th printing]

Page 44: in paragraph 4 "which can be either binary (BLOB) textual (CLOB" should be "which can be either binary (BLOB) or textual (CLOB" [Corrected in the 4th printing]

Page 45: On the last line of the first paragraph of the Inheritance section "hierarchy; Class Table Inheritance" should use a colon instead of a semi-colon. [Corrected in the 5th printing]

Page 45: At the end of the first paragraph of Inheritance "...relational system traditionally do poorly" should read "...relational systems traditionally do poorly". [Corrected in the 4th printing]

Page 45: Mid way through the first paragraph of Inheritance "You can have a one table..." should read "You can have one table..." [Corrected in the 4th printing]

Page 48: In the last sentence of the last paragraph, "You may want to pull similar data from both XML messages, CICS transactions, and relational tables." should read "You may want to pull similar data from a combination of XML messages, CICS transactions, and relational tables." [Corrected in the 4th printing]

Page 49: 3rd paragraph of section Using Metadata: <field name = customer ... should be (missing quotes) <field name = "customer" ... [Corrected in the 4th printing]

Page 52: First sentence of second paragraph "If you do things outside of a transaction..." should read "If you do things outside of your transaction..." Everything that hits a transactional database occurs in some transaction, but sometimes you want things to executed outside of the main transaction that you're focused on. [Corrected in the 5th printing]

Page 61: At the end of the first paragraph "depending some condition" should read "depending on some condition" [Corrected in the 4th printing]

Page 64: In the second paragraph "...easy to understand as well as well as familiar." should read "...easy to understand as well as familiar." [Corrected in the 4th printing]

Page 66: On the second line "It may consists of a single request" should read "It may consists of a single request" [Corrected in the 6th printing]

Page 67: In the second paragraph, "...arrange things so that the programs enters an isolated zone..." should read "...arrange things so that the programs enters an isolated zone..." [Corrected in the 6th printing]

Page 68: In the last paragraph "Martin edits the Customer class, which makes calls on the Order class" should read "Martin edits the Customer class and adds some calls to the Order class". [Corrected in the 4th printing]

Page 74: Paragraph before Business and System Transactions: "... should look at each transaction ande decide..." should be "... should look at each transaction and decide..." [Corrected in the 4th printing]

Page 74: In the fourth paragraph "You have to decide what risks you want take" should read "You have to decide what risks you want to take" [Corrected in the 6th printing]

Page 76: In the second paragraph, 3rd line: "...business transaction not leave the record..." should read "...business transaction does not leave the record..." [Corrected in the 6th printing]

Page 76: In the first paragraph, second sentence "...commit phase of the system transaction, when the user hits Save within a system transaction." should read "...commit phase of the system transaction, when the user hits Save, within a system transaction." (missing comma) [Corrected in the 5th printing]

Page 78: In the last paragraph "The main problem over process-per-session..." should read "The main problem of process for request over process-per-session..." [Corrected in the 5th printing]

Page 82: In the last sentence of the third paragraph, "If we forgo..." should read "If we forego..." [Corrected in the 4th printing]

Page 83: In the fourth paragraph of Session State "But it's not just changes that are a problem" should read "But it's not just direct changes that are a problem. [Corrected in the 5th printing]

Page 86: In the middle of the third paragraph "...as many features as quickly with as you would with..." should read "...as many features as quickly as you would with..." [Corrected in the 4th printing]

Page 89: In the fifth paragraph "If you base your distribution strategy on a classes..." should read "If you base your distribution strategy on classes..." [Corrected in the 4th printing]

Page 91: On the third line "have to have to pay" should read "have to pay" [Corrected in the 5th printing]

Page 97: At the beginning of the first paragraph of Down to the Data Source Layer, "Once you've chose your domain layer..." should read "Once you've chosen your domain layer..." [Corrected in the 5th printing]

Page 98: The heading "Data Source Table Module (125)" should read "Data Source for Table Module (125)" [Corrected in the 4th printing]

Page 99: The last but one paragraph is missing its last full stop. [Corrected in the 4th printing]

Page 99: The heading "The Presentation Layer" should be a higher level header and formatted (and in the contents) that way. [Corrected in the 4th printing]

Page 100: In the middle of the first paragraph of Some Technology Specific Advice "... reason I've concentrating on..." should read "... reason I'm concentrating on..." [Corrected in the 4th printing]

Page 101: In the 6th line of the second paragraph "CMP" should read "Container Managed Persistance (CMP)" [Corrected in the 5th printing]

Page 102: The continuing paragraph at the top is missing its final full stop. [Corrected in the 5th printing]

Page 106: On the fifth line "I tend to look as it..." should read "I tend to look at it..." [Corrected in the 5th printing]

Page 117: In the second sentence of the last paragraph "some of the order behavior is only needed only for it" should read "some of the order behavior is only needed only for it [Corrected in the 5th printing]

Page 118: In the third paragraph of Java Implementation "Entity beans can't be re-entrant..." should read "Entity beans shouldn't be re-entrant...". (While you can make entity beans re-entrant, to do so exposes you to some dangerous concurrency problems.) [Corrected in the 6th printing]

Page 119: The first sentence of second paragraph of "when to use it" should read "One factor that comes into this is how comfortable the development team is with domain objects" [Corrected in the 4th printing]

Page 121: In the class diagram, the method "calculateRecognitions" on class Product should read "calculateRevenueRecognitions" (in order to be consistent with the code on page 123.

Page 130: In the paragraph at the middle of the page "updating the revenue recognition tables" should read "updating the revenue recognition tables (incorrect plural). [Corrected in the 5th printing]

Page 148: In the second paragraph of the example the second sentence "In find it useful..." should read "I find it useful..." [Corrected in the 4th printing]

Page 150: Half way down the code snipped that starts with public DataRow this[long key] should headed as being in the PersonGateway class [Corrected in the 4th printing]

Page 151: The heading for the code snippet should read class PersonGateway [Corrected in the 4th printing]

Page 151: The line of code that reads long key = new PersonGatewayDS().GetNextID() should read long key = GetNextID() [Corrected in the 4th printing]

Page 156: In the code examples for PersonGateway.update() and insert(), the method getID() is being used but it's not clear where getID() is coming from. The ID would be stored in a Layer Supertype for Row Data Gateways [Cannot be fixed in reprints]

Page 158: In the code block with many calls to append, the last one is missing its last few characters. The line should read

result.append("\n");
[Corrected in the 5th printing]

Page 169: second paragraph "For simpler applications, though, may not be worth..." should be "For simpler applications, though, it may not be worth..." [Corrected in the 4th printing]

Page 192: Last text paragraph, "Now we can now" should read "Now we can now" [Corrected in the 19th printing]

Page 201: In the sixth paragraph, "These problem don't hit" should read "These problems don't hit"

Page 201: In the second paragraph, "a legal value field value" should read "a legal value field value"

Page 206: In the last code example, the heading "class Domain Object" should read "class DomainObject" (no space)

Page 207: In the first code example, class Domain Object should read class DomainObject (no space). [Corrected in the 10th printing]

Page 211: In the third paragraph "… a loading function than can be supplied …" should read "… a loading function that can be supplied …"

Page 238: Fourth paragraph, last sentance. "diff with the database is you're using" should read "diff with the database if you're using" [Corrected in the 16th printing]

Page 239: In the fifth paragraph "... but if you're testing is good enough..." should be "... but if your testing is good enough..." [Corrected in the 4th printing]

Page 249: first paragraph after "When to use it" "...since there are really no any alternatives..." should be "...since there are really no alternatives..." [Corrected in the 4th printing]

Page 259: In the fourth line of the first text paragraph "If it not I load…" should read "If not, I load…"

Page 279: Start of last paragraph "Rremember" should be "Remember" [Corrected in the 16th printing]

Page 291: The first code example in the page shows the Update method on class Mapper.

		
    public virtual void Update (DomainObject arg) {
			Save (arg);
		}
This is the wrong code fragment. Instead it should read
		public virtual long Insert (DomainObject obj) {
			obj.Id = GetNextID();
			AddRow(obj);
			Save(obj);
			return obj.Id;
		}
Automatic code import is wonderful, but I still have to import the correct fragment! [Corrected in the 6th printing]

Page 294: At the end of the second paragraph "Thus, you thus need a key" is over-thused [Corrected in the 16th printing]

Page 326: In code sample for PersonRepository the line

public List dependentsOf(aPerson) {
should read
public List  dependentsOf(Person aPerson) {
(The 5th printing fixed this but introduced a different error, repeating List :-( [Corrected in the 6th printing]

Page 326: In the code sample for Repository the line

protected List matching(aCriteria) {
should read
protected List matching(Criteria aCriteria) {
Sadly my contributors weren't able to take advantage of my automatic code import mechanism. [Corrected in the 5th printing]

Page 351: Last line of third paragraph. "(providing your HTML is XHMTL..." should read "(providing your HTML is XHTML...". Of course. [Corrected in the 9th printing]

Page 354: Last sentence of first paragraph "...involve program logic, which program logic everywhere..." should read "...involve program logic, which like program logic everywhere..." [Corrected in the 4th printing]

Page 354: In the second paragraph "...compiling the page or on its first request..." should read "...compiling the page on its first request..." [Corrected in the 4th printing]

Page 357: In the third bullet point "(the number of balls he faced divided by the runs he scored)" should read the other way around: "(the runs he scored divided by the number of balls he faced)"

Page 362: second paragraph "for example , a .NET" should read "for example , a .NET object" [Corrected in the 4th printing]

Page 362: third paragraph "... the transform don't have to be a string..." should read "... the transform doesn't have to be a string..." [Corrected in the 4th printing]

Page 371: First sentance in example section. "This approach to a Two Step View uses a two-stage XLST transformation" should read "This approach to a Two Step View uses a two-stage XSLT transformation" [Corrected in the 19th printing]

Page 374: In the second code example the line album = Album.findNamed("1234"); should be removed.

Page 380: In the first paragraph, first sentance. "the view with which display the response" should read "the view with which to display the response" [Corrected in the 16th printing]

Page 389: First sentance under "How it Works". "Remote Facade tackles the distribution problem which the standard OO approach..." should read "Remote Facade tackles the distribution problem with the standard OO approach..."

Page 391: In the last paragraph "The main difference is that a service layer doesn't have to be remote and thus doesn't need to have only fine-grained methods." should read "The main difference is that a service layer doesn't have to be remote and thus doesn't need to have only coarse-grained methods." [Corrected in the 4th printing]

Page 402: In the first paragraph, second sentence "Data Transfer Object will usually carries much more..." should read "Data Transfer Object usually carries much more..." [Corrected in the 4th printing]

Page 406: Fourth paragraph starts "Another alternative is to use a some form of ..." This should read "Another alternative is to use some form of ..." [Corrected in the 4th printing]

Page 412: Second sentance has spurious words: "I write methods to read and write an XML element to represent that class each Data Transfer Object class." [Corrected in the 16th printing]

Page 423: Last code block, first line class class AbstractMapper... should read class class AbstractMapper... [Corrected in the 19th printing]

Page 423: In the code example at the bottom of the page we need to insert another line of code. After the line stmt.setLong(1,object.getId().longValue()); add the line stmt.setInt(2, object.getVersion() + 1); [Corrected in the 16th printing]

Page 429: last but one line. "access to the lock table must by serialized" should read "access to the lock table must be serialized"

Page 432: In code block class ExclusiveReadLockManagerDBImpl implements ExclusiveLockManager... should read class ExclusiveReadLockManagerDBImpl implements ExclusiveReadLockManager [Corrected in the 19th printing]

Page 432: In the create table line of code ownerid bigint should read ownerid varchar

Page 436: In the code "class EditCustomerCommand implements Command..." should read "class EditCustomerCommand extends BusinessTransactionCommand...". Similarly "class SaveCustomerCommand implements Command..." should read "class SaveCustomerCommand extends BusinessTransactionCommand...". (A small but awkward gap in my fancy auto import feature.) [Corrected in the 9th printing]

Page 457: last line "... reduce this risk; if not run, a simple session..." should be (misplaced comma) "... reduce this risk; if not, run a simple session..." [Corrected in the 4th printing]

Page 470: In the middle of the page the error message Null Parameter bassed for msg type... should read Null Parameter passed for msg type... Unless, of course, you like attaching your parameters to a fish. [Corrected in the 4th printing]

Page 475: In the paragraph under When to Use It the sentence starting "I Often..." should read "I often..." (miscapitalization). [Corrected in the 4th printing]

Page 485: In the last code example the line Person martin = Registry.personFinder().find(1); should read Person martin = f1.find(1); [Corrected in the 10th printing]

Page 494: The allocate algorithms shown only work with postive monies. I leave the solution for negative monies as an exercise for the reader. [Cannot be fixed in reprints]

Page 496: In the second sentence of the second paragraph "Often the right thing is same..." should read "Often the right thing is the same..." [Corrected in the 4th printing]

Page 497: In the last sentence of the second paragraph "you can accumulate charges against an occupant customer even you can't do much billing" should read "you can accumulate charges against an occupant customer even if you can't do much billing" [Corrected in the 10th printing]

Page 502: In the first sentence of the first paragraph "...nextId() select the next available number..." should read "...nextId() selects the next available number..." [Corrected in the 4th printing]

Page 502: In the third sentence of the last paragraph "... to find the file rather then looking..." should read "... to find the file rather than looking..." [Corrected in the 4th printing]

Page 505: In the third paragraph "... a lot of our application functionality dependents on..." should read "... a lot of our application functionality depends on..." [Corrected in the 4th printing]

Page 505: In the first sentence of the last paragraph "...a tax service that deployed..." should read "...a tax service that's deployed..." [Corrected in the 4th printing]

Page 505: In the middle of the fifth paragraph the second reference to Gateway (466 is missing its closed parenthesis. [Corrected in the 4th printing]

Page 510: In the first paragraph of When to Use It "...Record Set, and a compelling reason..." should read "...Record Set, and that's a compelling reason..." [Corrected in the 4th printing]

Errors in the 1st thru 3rd printing

Page tabs: On the whole the tabs on the edge of pages work well. However from page 426 onward all the tabs got shifted up a notch, which sadly spoils the effect. [Corrected in the 5th printing]

Page inside back cover: Under "How do I interact with the database" add a line "I'm using Table Module(125) -> Table Data Gateway(144) [Corrected in the 3rd printing]

Page 9: In the second paragraph there are a couple of spots where Swordfish and Camel aren't capitalized. [Corrected in the 5th printing]

Page 17: The last sentence of the second paragraph is missing its close parenthesis. [Corrected in the 5th printing]

Page 21: On line 5 "there is no a human being" should read "there is no a human being". [Corrected in the 19th printing]

Page 21: Top line: "would be particularly for communication with existing packages" should read "would be particularly common for communication with existing packages" [Corrected in the 13th printing]

Page 24: In the second to last paragraph "... try to keep all the code..." should read "... try to keep all of a node's code..." [Corrected in the 5th printing]

Page 33: The first sentence of the second paragraph: "One the biggest reasons" should read "One of the biggest reasons" [Corrected in the 4th printing]

Page 33: In the second to last sentence of the last paragraph, language is misspelled. [Corrected in the 5th printing]

Page 33: In the last sentence of the last paragraph "Database Administrations (DBAs) also like..." should read "Database Administrators (DBAs) also like..." [Corrected in the 4th printing]

Page 34: (7th Printing only) In some copies this page is completely blank due to a printing error. If you have this problem, please contact John Fuller at Addison Wesley. [Corrected in the 8th printing]

Page 34: On the third line from bottom "you only need a single class for each table" should read "you only need a single object for each table [Corrected in the 6th printing]

Page 36: In the second paragraph "All of these forces push you to in'direction" should read "All of these forces push you to indirection" (remove errant apostrophe) [Corrected in the 4th printing]

Page 44: 3rd sentence of 3rd paragraph, "...linked object as a Embedded Value..." should read "...linked object as an Embedded Value..." [Corrected in the 5th printing]

Page 44: in paragraph 4 "which can be either binary (BLOB) textual (CLOB" should be "which can be either binary (BLOB) or textual (CLOB" [Corrected in the 4th printing]

Page 45: On the last line of the first paragraph of the Inheritance section "hierarchy; Class Table Inheritance" should use a colon instead of a semi-colon. [Corrected in the 5th printing]

Page 45: At the end of the first paragraph of Inheritance "...relational system traditionally do poorly" should read "...relational systems traditionally do poorly". [Corrected in the 4th printing]

Page 45: Mid way through the first paragraph of Inheritance "You can have a one table..." should read "You can have one table..." [Corrected in the 4th printing]

Page 48: In the last sentence of the last paragraph, "You may want to pull similar data from both XML messages, CICS transactions, and relational tables." should read "You may want to pull similar data from a combination of XML messages, CICS transactions, and relational tables." [Corrected in the 4th printing]

Page 49: 3rd paragraph of section Using Metadata: <field name = customer ... should be (missing quotes) <field name = "customer" ... [Corrected in the 4th printing]

Page 52: First sentence of second paragraph "If you do things outside of a transaction..." should read "If you do things outside of your transaction..." Everything that hits a transactional database occurs in some transaction, but sometimes you want things to executed outside of the main transaction that you're focused on. [Corrected in the 5th printing]

Page 61: At the end of the first paragraph "depending some condition" should read "depending on some condition" [Corrected in the 4th printing]

Page 64: In the second paragraph "...easy to understand as well as well as familiar." should read "...easy to understand as well as familiar." [Corrected in the 4th printing]

Page 66: On the second line "It may consists of a single request" should read "It may consists of a single request" [Corrected in the 6th printing]

Page 67: In the second paragraph, "...arrange things so that the programs enters an isolated zone..." should read "...arrange things so that the programs enters an isolated zone..." [Corrected in the 6th printing]

Page 68: In the last paragraph "Martin edits the Customer class, which makes calls on the Order class" should read "Martin edits the Customer class and adds some calls to the Order class". [Corrected in the 4th printing]

Page 71: In the third paragraph "each transaction must complete on and all-or-nothing basis" should read "each transaction must complete on an all-or-nothing basis". [Corrected in the 3rd printing]

Page 74: Paragraph before Business and System Transactions: "... should look at each transaction ande decide..." should be "... should look at each transaction and decide..." [Corrected in the 4th printing]

Page 74: In the fourth paragraph "You have to decide what risks you want take" should read "You have to decide what risks you want to take" [Corrected in the 6th printing]

Page 75: In the second paragraph "This is what we call a business transaction, and that displays the same ACID properties as a system transaction seems a reasonable expectation" should read "This is what we call a business transaction, and that it displays the same ACID properties as a system transaction seems a reasonable expectation". [Corrected in the 3rd printing]

Page 76: In the second paragraph, 3rd line: "...business transaction not leave the record..." should read "...business transaction does not leave the record..." [Corrected in the 6th printing]

Page 76: In the first paragraph, second sentence "...commit phase of the system transaction, when the user hits Save within a system transaction." should read "...commit phase of the system transaction, when the user hits Save, within a system transaction." (missing comma) [Corrected in the 5th printing]

Page 78: In the last paragraph "The main problem over process-per-session..." should read "The main problem of process for request over process-per-session..." [Corrected in the 5th printing]

Page 82: In the last sentence of the third paragraph, "If we forgo..." should read "If we forego..." [Corrected in the 4th printing]

Page 83: In the fourth paragraph of Session State "But it's not just changes that are a problem" should read "But it's not just direct changes that are a problem. [Corrected in the 5th printing]

Page 86: In the middle of the third paragraph "...as many features as quickly with as you would with..." should read "...as many features as quickly as you would with..." [Corrected in the 4th printing]

Page 88: The figure caption for figure 7.1 should read "Distributing an application by putting different components on different nodes (not recommended!)" [Corrected in the 3rd printing]

Page 89: In the fifth paragraph "If you base your distribution strategy on a classes..." should read "If you base your distribution strategy on classes..." [Corrected in the 4th printing]

Page 91: On the third line "have to have to pay" should read "have to pay" [Corrected in the 5th printing]

Page 91: In the second paragraph under the Section "Working with the Distribution Boundary", "The coarse-grained objects don't really do anything but so they act as a facade for the fine-grained objects" should read "The coarse-grained objects don't really do anything but delegate so they act as a facade for the fine-grained objects". [Corrected in the 3rd printing]

Page 96: In the fourth paragraph "Also. my experiences" should read "Also, my experiences..." (errant full stop.) [Corrected in the 3rd printing]

Page 97: At the beginning of the first paragraph of Down to the Data Source Layer, "Once you've chose your domain layer..." should read "Once you've chosen your domain layer..." [Corrected in the 5th printing]

Page 98: The heading "Data Source Table Module (125)" should read "Data Source for Table Module (125)" [Corrected in the 4th printing]

Page 99: The last but one paragraph is missing its last full stop. [Corrected in the 4th printing]

Page 99: The heading "The Presentation Layer" should be a higher level header and formatted (and in the contents) that way. [Corrected in the 4th printing]

Page 100: In the middle of the first paragraph of Some Technology Specific Advice "... reason I've concentrating on..." should read "... reason I'm concentrating on..." [Corrected in the 4th printing]

Page 101: In the 6th line of the second paragraph "CMP" should read "Container Managed Persistance (CMP)" [Corrected in the 5th printing]

Page 101: In the first paragraph the last sentence "If you're not sure about EJB..." should be deleted. (It doesn't make any sense, all I can think is that it got orphaned from the paragraph that followed.) [Corrected in the 3rd printing]

Page 102: The continuing paragraph at the top is missing its final full stop. [Corrected in the 5th printing]

Page 106: On the fifth line "I tend to look as it..." should read "I tend to look at it..." [Corrected in the 5th printing]

Page 106: In the second paragraph "...Nilsson uses stored procedures extensivel," should read "...Nilsson uses stored procedures extensively,". [Corrected in the 3rd printing]

Page 113: There is a redundancy in the code example of findRecognitionsFor() of class Gateway. The second line of code: stmt = db.prepareStatement(findRecognitionsStatement); can be removed since it does the same thing as the preceding line. [Corrected in the 3rd printing]

Page 117: In the second sentence of the last paragraph "some of the order behavior is only needed only for it" should read "some of the order behavior is only needed only for it [Corrected in the 5th printing]

Page 118: In the third paragraph of Java Implementation "Entity beans can't be re-entrant..." should read "Entity beans shouldn't be re-entrant...". (While you can make entity beans re-entrant, to do so exposes you to some dangerous concurrency problems.) [Corrected in the 6th printing]

Page 119: The first sentence of second paragraph of "when to use it" should read "One factor that comes into this is how comfortable the development team is with domain objects" [Corrected in the 4th printing]

Page 121: In the class diagram, the method "calculateRecognitions" on class Product should read "calculateRevenueRecognitions" (in order to be consistent with the code on page 123.

Page 122: In the first paragraph, "The strategy pattern [Gang of Four] is a well-known OO pattern that allows you combine a group..." should read "The strategy pattern [Gang of Four] is a well-known OO pattern that allows you to combine a group..." [Corrected in the 3rd printing]

Page 130: In the paragraph at the middle of the page "updating the revenue recognition tables" should read "updating the revenue recognition tables (incorrect plural). [Corrected in the 5th printing]

Page 139: In the UML class diagram for ApplicationService, the method listing "+getIntegationGateway() : IntegrationGateway" should read "+getIntegrationGateway() : IntegrationGateway". [Corrected in the 3rd printing]

Page 141: In the UML class diagram for ApplicationServiceBeanImpl, the method listing "+getIntegationService() : IntegrationService" should read, "+getIntegrationService() : IntegrationService". [Corrected in the 3rd printing]

Page 145: In the second paragraph, "bidirectional dependencies the domain objects" should read "bidirectional dependencies between the domain objects". [Corrected in the 3rd printing]

Page 148: In the second paragraph of the example the second sentence "In find it useful..." should read "I find it useful..." [Corrected in the 4th printing]

Page 149: The constructors (protected DataSetGateway() and protected DataSetGateway(DataSetHolder holder)) should read protected DataGateway() and protected DataGateway(DataSetHolder holder) [Corrected in the 3rd printing]

Page 150: Half way down the code snipped that starts with public DataRow this[long key] should headed as being in the PersonGateway class [Corrected in the 4th printing]

Page 151: The heading for the code snippet should read class PersonGateway [Corrected in the 4th printing]

Page 151: The line of code that reads long key = new PersonGatewayDS().GetNextID() should read long key = GetNextID() [Corrected in the 4th printing]

Page 156: In the code examples for PersonGateway.update() and insert(), the method getID() is being used but it's not clear where getID() is coming from. The ID would be stored in a Layer Supertype for Row Data Gateways [Cannot be fixed in reprints]

Page 158: In the code block with many calls to append, the last one is missing its last few characters. The line should read

result.append("\n");
[Corrected in the 5th printing]

Page 169: second paragraph "For simpler applications, though, may not be worth..." should be "For simpler applications, though, it may not be worth..." [Corrected in the 4th printing]

Page 189: In the second sentence, "more than one thread can't get access a Unit of Work" should read "more than one thread can't get access to a Unit of Work" ". [Corrected in the 3rd printing]

Page 189: In the paragraph under ".NET Implementation", "a data set, which is a series of objects arranged like tables, rows, database and columns." should read "a data set, which is a series of objects arranged like database tables, rows, database and columns." [Corrected in the 3rd printing]

Page 192: Last text paragraph, "Now we can now" should read "Now we can now" [Corrected in the 19th printing]

Page 201: In the sixth paragraph, "These problem don't hit" should read "These problems don't hit"

Page 201: In the second paragraph, "a legal value field value" should read "a legal value field value"

Page 206: In the last code example, the heading "class Domain Object" should read "class DomainObject" (no space)

Page 207: In the first code example, class Domain Object should read class DomainObject (no space). [Corrected in the 10th printing]

Page 211: In the third paragraph "… a loading function than can be supplied …" should read "… a loading function that can be supplied …"

Page 238: Fourth paragraph, last sentance. "diff with the database is you're using" should read "diff with the database if you're using" [Corrected in the 16th printing]

Page 239: In the fifth paragraph "... but if you're testing is good enough..." should be "... but if your testing is good enough..." [Corrected in the 4th printing]

Page 249: first paragraph after "When to use it" "...since there are really no any alternatives..." should be "...since there are really no alternatives..." [Corrected in the 4th printing]

Page 259: In the fourth line of the first text paragraph "If it not I load…" should read "If not, I load…"

Page 270: In the first paragraph "refers to tit" should read "refers to it". Those who think they've found a Freudian slip should note that in Britain there is a family of small birds called tits. [Corrected in the 3rd printing]

Page 279: Start of last paragraph "Rremember" should be "Remember" [Corrected in the 16th printing]

Page 291: The first code example in the page shows the Update method on class Mapper.

		
    public virtual void Update (DomainObject arg) {
			Save (arg);
		}
This is the wrong code fragment. Instead it should read
		public virtual long Insert (DomainObject obj) {
			obj.Id = GetNextID();
			AddRow(obj);
			Save(obj);
			return obj.Id;
		}
Automatic code import is wonderful, but I still have to import the correct fragment! [Corrected in the 6th printing]

Page 294: At the end of the second paragraph "Thus, you thus need a key" is over-thused [Corrected in the 16th printing]

Page 326: In code sample for PersonRepository the line

public List dependentsOf(aPerson) {
should read
public List  dependentsOf(Person aPerson) {
(The 5th printing fixed this but introduced a different error, repeating List :-( [Corrected in the 6th printing]

Page 326: In the code sample for Repository the line

protected List matching(aCriteria) {
should read
protected List matching(Criteria aCriteria) {
Sadly my contributors weren't able to take advantage of my automatic code import mechanism. [Corrected in the 5th printing]

Page 331: In the third paragraph "Fundamentally presentation and view are about different concerns" should read "Fundamentally presentation and model are about different concerns." In this pattern I consider presentation to be the combination of MVC view and (input) controller. [Corrected in the 3rd printing]

Page 331: In the third paragraph "and they people" should read "and they" [Corrected in the 3rd printing]

Page 351: Last line of third paragraph. "(providing your HTML is XHMTL..." should read "(providing your HTML is XHTML...". Of course. [Corrected in the 9th printing]

Page 354: Last sentence of first paragraph "...involve program logic, which program logic everywhere..." should read "...involve program logic, which like program logic everywhere..." [Corrected in the 4th printing]

Page 354: In the second paragraph "...compiling the page or on its first request..." should read "...compiling the page on its first request..." [Corrected in the 4th printing]

Page 357: In the third bullet point "(the number of balls he faced divided by the runs he scored)" should read the other way around: "(the runs he scored divided by the number of balls he faced)"

Page 362: second paragraph "for example , a .NET" should read "for example , a .NET object" [Corrected in the 4th printing]

Page 362: third paragraph "... the transform don't have to be a string..." should read "... the transform doesn't have to be a string..." [Corrected in the 4th printing]

Page 371: First sentance in example section. "This approach to a Two Step View uses a two-stage XLST transformation" should read "This approach to a Two Step View uses a two-stage XSLT transformation" [Corrected in the 19th printing]

Page 374: In the second code example the line album = Album.findNamed("1234"); should be removed.

Page 380: In the first paragraph, first sentance. "the view with which display the response" should read "the view with which to display the response" [Corrected in the 16th printing]

Page 389: First sentance under "How it Works". "Remote Facade tackles the distribution problem which the standard OO approach..." should read "Remote Facade tackles the distribution problem with the standard OO approach..."

Page 391: In the last paragraph "The main difference is that a service layer doesn't have to be remote and thus doesn't need to have only fine-grained methods." should read "The main difference is that a service layer doesn't have to be remote and thus doesn't need to have only coarse-grained methods." [Corrected in the 4th printing]

Page 402: In the first paragraph, second sentence "Data Transfer Object will usually carries much more..." should read "Data Transfer Object usually carries much more..." [Corrected in the 4th printing]

Page 402: In the third paragraph "you usually don't want the domain object classes on the server" should read "you usually don't want the domain object classes on the client [Corrected in the 3rd printing]

Page 406: Fourth paragraph starts "Another alternative is to use a some form of ..." This should read "Another alternative is to use some form of ..." [Corrected in the 4th printing]

Page 412: Second sentance has spurious words: "I write methods to read and write an XML element to represent that class each Data Transfer Object class." [Corrected in the 16th printing]

Page 423: Last code block, first line class class AbstractMapper... should read class class AbstractMapper... [Corrected in the 19th printing]

Page 423: In the code example at the bottom of the page we need to insert another line of code. After the line stmt.setLong(1,object.getId().longValue()); add the line stmt.setInt(2, object.getVersion() + 1); [Corrected in the 16th printing]

Page 429: last but one line. "access to the lock table must by serialized" should read "access to the lock table must be serialized"

Page 432: In code block class ExclusiveReadLockManagerDBImpl implements ExclusiveLockManager... should read class ExclusiveReadLockManagerDBImpl implements ExclusiveReadLockManager [Corrected in the 19th printing]

Page 432: In the create table line of code ownerid bigint should read ownerid varchar

Page 436: In the code "class EditCustomerCommand implements Command..." should read "class EditCustomerCommand extends BusinessTransactionCommand...". Similarly "class SaveCustomerCommand implements Command..." should read "class SaveCustomerCommand extends BusinessTransactionCommand...". (A small but awkward gap in my fancy auto import feature.) [Corrected in the 9th printing]

Page 457: last line "... reduce this risk; if not run, a simple session..." should be (misplaced comma) "... reduce this risk; if not, run a simple session..." [Corrected in the 4th printing]

Page 470: In the middle of the page the error message Null Parameter bassed for msg type... should read Null Parameter passed for msg type... Unless, of course, you like attaching your parameters to a fish. [Corrected in the 4th printing]

Page 475: In the paragraph under When to Use It the sentence starting "I Often..." should read "I often..." (miscapitalization). [Corrected in the 4th printing]

Page 485: In the last code example the line Person martin = Registry.personFinder().find(1); should read Person martin = f1.find(1); [Corrected in the 10th printing]

Page 494: The allocate algorithms shown only work with postive monies. I leave the solution for negative monies as an exercise for the reader. [Cannot be fixed in reprints]

Page 496: In the second sentence of the second paragraph "Often the right thing is same..." should read "Often the right thing is the same..." [Corrected in the 4th printing]

Page 497: In the last sentence of the second paragraph "you can accumulate charges against an occupant customer even you can't do much billing" should read "you can accumulate charges against an occupant customer even if you can't do much billing" [Corrected in the 10th printing]

Page 502: In the first sentence of the first paragraph "...nextId() select the next available number..." should read "...nextId() selects the next available number..." [Corrected in the 4th printing]

Page 502:

There is an error in the code example. The static code in class plugin factory should read:

 
static { 
  try { 
    String propsFile = System.getProperty("plugins"); 
    props.load(new FileInputStream(propsFile)); 
  } catch (Exception ex) { 
    throw new ExceptionInInitializerError(ex); 
  } 
} 

This is a rather alarming error for me, as I was proud of my automatic code import system to avoid such bugs. Even worse I can't figure out how this one got in. Even my final framemaker files I shipped to AW contained the correct code. Some mysteries are forever there to haunt us.

[Corrected in the 3rd printing]

Page 502: In the third sentence of the last paragraph "... to find the file rather then looking..." should read "... to find the file rather than looking..." [Corrected in the 4th printing]

Page 503: Half way down, the code sample heading class IdGenerator should read interface IdGenerator. [Corrected in the 3rd printing]

Page 505: In the third paragraph "... a lot of our application functionality dependents on..." should read "... a lot of our application functionality depends on..." [Corrected in the 4th printing]

Page 505: In the first sentence of the last paragraph "...a tax service that deployed..." should read "...a tax service that's deployed..." [Corrected in the 4th printing]

Page 505: In the middle of the fifth paragraph the second reference to Gateway (466 is missing its closed parenthesis. [Corrected in the 4th printing]

Page 510: In the first paragraph of When to Use It "...Record Set, and a compelling reason..." should read "...Record Set, and that's a compelling reason..." [Corrected in the 4th printing]

Page 512: The URL for [Brown and Whitenack] shoud be http://members.aol.com/kgb1001001/Chasms.htm. In the book I failed to capitalize Chasms. [Corrected in the 3rd printing]


Many thanks to =Duncan Sung W. Kim, Kent Wang, Pradyumn Sharma, Timothy Halloran, Kaspar Thommen, Roger Stasko, Einar Jónsson, Ray Ye, Neil Lowden, David van Leerdam, Yamano Yuji, Anatoly Varakin, Chris Bernard, Mark Wilden, Eduard Penzhorn, Gregor Hohpe, Craig Demyanovich, Thierry Bernard, Scott Hodson, Geoff Catlin, Danny Trieu, Ray Ye, Ted Schrader, Héctor Domínguez, Steve Berczuk, George Hicks, Yousif Masoud, Dylan Nissley, and Emanuel Reisinger for spotting and telling me about these errors