Changes for page EOF-Using EOF-EOGenerator
Last modified by Pascal Robert on 2012/01/21 22:03
From version 12.1
edited by smmccraw
on 2007/07/08 09:44
on 2007/07/08 09:44
Change comment:
There is no comment for this version
To version 18.1
edited by David LeBer
on 2007/12/22 13:19
on 2007/12/22 13:19
Change comment:
There is no comment for this version
Summary
-
Page properties (3 modified, 0 added, 0 removed)
Details
- Page properties
-
- Title
-
... ... @@ -1,1 +1,1 @@ 1 - Programming__WebObjects-EOF-Using EOF-EOGenerator1 +EOF-Using EOF-EOGenerator - Author
-
... ... @@ -1,1 +1,1 @@ 1 -XWiki. smmccraw1 +XWiki.dleber - Content
-
... ... @@ -1,9 +1,18 @@ 1 -== Overview == 1 +|= Contents 2 +| {{toc style="disc" minLevel="2"}}{{/toc}} 2 2 3 - Ifyou've ever used EOModeler's Java sourcecode generator, you know how much of a pain it can be when you make changes to your model objects and have to merge changesin later. One solution for this is to use [[EOGenerator>>http://www.rubicode.com/Software/EOGenerator/]],an application developed by Rubicode Software, which uses the Generation Gap pattern to create your Java files from your EOModels. EOGenerator produces TWO java files for each Entity rather than one. Take the example of a Person entity. The first java file is //Person.java, which contains all of the autogenerated methods. The second java file is Person.java, and Person extends //Person. The second file is where you place all of your customizations. Any time your model changes, only your //Xxx.java files are updated, and your customizations are left untouched. Additionally, EOGenerator allows for the creation of extensive custom templates for your files, which provides the ability to place convenience methods in your //Xxx.java files.4 +== Overview == 4 4 5 - ==Advantages==6 +If you've ever used EOModeler's Java source code generator, you know how much of a pain it can be when you make changes to your model objects and have to merge changes in later. One solution for this is to use [[EOGenerator>>http://www.rubicode.com/Software/EOGenerator/]], an application developed by Rubicode Software, which uses the Generation Gap pattern to create your Java files from your EOModels. EOGenerator produces TWO java files for each Entity rather than one. Take the example of a Person entity. The first java file is Person.java, which contains all of the autogenerated methods. The second java file is Person.java, and Person extends Person. The second file is where you place all of your customizations. Any time your model changes, only your Xxx.java files are updated, and your customizations are left untouched. Additionally, EOGenerator allows for the creation of extensive custom templates for your files, which provides the ability to place convenience methods in your Xxx.java files. 6 6 8 +{{warning}} 9 + 10 +EOGenerator doesn't work on Mac OS X 10.5. You have to use [JavaEOGenerator|http://developer.apple.com/samplecode/JavaEOGenerator/] or [Velocity EOGenerator|WOL:Velocity EOGenerator (Veogen)]. 11 + 12 +{{/warning}} 13 + 14 +== Advantages == 15 + 7 7 There are several advantages to using EOGenerator over EOModeler's default Java file generation and merging with FileMerge. 8 8 9 9 * EOGenerator uses the Generation Gap pattern, which provides a much cleaner separation of autogenerated vs customized code with no need to deal with merging at all. There are border cases with FileMerge that can cause you to deal with annoying conflicts. ... ... @@ -10,7 +10,7 @@ 10 10 * EOGenerator uses the MiscMerge language for its templates. This allows you to extend the core templates with extensive customizations (see the EOGenerator Mods section below), better supporting your own custom development process and workflow. 11 11 * As David LaBer put it, "all the cool kids use it - and we all know looking cool is the **most** important criteria". 12 12 13 -== How To Use It 22 +== How To Use It == 14 14 15 15 Kieran Kelleher has writtten an [[Introduction to EOGenerator>>http://homepage.mac.com/kelleherk/iblog/C1837526061/E1908382110/index.html]] on his blog. 16 16 ... ... @@ -21,33 +21,34 @@ 21 21 22 22 {{panel}} 23 23 24 - eogenerator -model /path/to/model/YourModel.eomodeld -destination /path/to/source/folder -subclassDestination /path/to/source/folder -templatedir /path/to/EOGenerator/templates -java -packagedirs 33 +eogenerator \-model /path/to/model/YourModel.eomodeld \-destination /path/to/source/folder 34 +\-subclassDestination /path/to/source/folder \-templatedir /path/to/EOGenerator/templates \-java \-packagedirs 25 25 26 26 {{/panel}} 27 27 28 28 Voila. EOGenerator will spit out your Java files for you. Let's break down the commands you can pass in: 29 29 30 -* --define--EOGenericRecord <class>, allows you to specify the//Person class's superclass. For instance, if you use Project Wonder, you would specify--define--EOGenericRecord er.extensions.ERXGenericRecord//31 -* --destination <path>, the folder that//Person.java//--//style java files will be produced in (the non-editable files)//32 -* --java, produce java files--33 -* --javaTemplate <filename>, the name of the Java template to use inside of the template dir (//Person)//--34 -* --model <path>, Passes in the path of a .eomodeld you would like to generate Java files for. You can actually include multiple--model commands on the commandline35 -* --packagedirs, produce package directory for any package statements defined in your Java files (not necessary if you don't specify package names on your entities. By the way, you should specify packages on your entities :) )--36 -* --refmodel <path>, Passes in the path of an .eomodeld that is required for generating Java files, but that won't actually have Java files generated for it. For instance, you should--refmodel any prototypes, or any models in other frameworks that you depend on37 -* --subclassDestination <path>, the folder that Person.java--style java files will be produced in (the editable files)38 -* --subclassJavaTemplate <filename>, the name of the Java subclass template to use inside of the template dir (Person)--39 -* --templatedir <path>, the path to the folder that contains EOGenerator templates--40 -* --verbose, turn on verbose output--40 +* define-EOGenericRecord <class>, allows you to specify the Person class's superclass. For instance, if you use Project Wonder, you would specify define-EOGenericRecord er.extensions.ERXGenericRecord 41 +* destination <path>, the folder that Person.java-style java files will be produced in (the non-editable files) 42 +* java, produce java files 43 +* javaTemplate <filename>, the name of the Java template to use inside of the template dir (//Person)// 44 +* model <path>, Passes in the path of a .eomodeld you would like to generate Java files for. You can actually include multiple model commands on the commandline 45 +* packagedirs, produce package directory for any package statements defined in your Java files (not necessary if you don't specify package names on your entities. By the way, you should specify packages on your entities :-) ) 46 +* refmodel <path>, Passes in the path of an .eomodeld that is required for generating Java files, but that won't actually have Java files generated for it. For instance, you should refmodel any prototypes, or any models in other frameworks that you depend on 47 +* subclassDestination <path>, the folder that Person.java-style java files will be produced in (the editable files) 48 +* subclassJavaTemplate <filename>, the name of the Java subclass template to use inside of the template dir (Person) 49 +* templatedir <path>, the path to the folder that contains EOGenerator templates 50 +* verbose, turn on verbose output 41 41 42 -== Custom EOGenerator Mods 52 +== Custom EOGenerator Mods == 43 43 44 -=== Zak Burke 54 +=== Zak Burke === 45 45 46 46 Allow setting nulls on a to-one relationship (and turn it into a remove). Note, this is also included in Jonathan Rentzsch's templates. 47 47 48 -{{ panel}}58 +{{code}} 49 49 50 - 60 +public void save<$ToOneRelationship.name.initialCapitalString$>(<$ToOneRelationship.destinationEntity.referenceJavaClassName$> value) 51 51 { 52 52 if (value == null) 53 53 { ... ... @@ -61,68 +61,58 @@ 61 61 } 62 62 } 63 63 64 -{{/ panel}}74 +{{/code}} 65 65 66 -=== Chuck Hill 76 +=== Chuck Hill === 67 67 68 68 Return the list of changes between the current EO and the last committed version of the EO: 69 69 70 -{{ panel}}80 +{{code}} 71 71 72 - 82 +public NSDictionary changedProperties() { 73 73 NSDictionary commitedValues = editingContext().committedSnapshotForObject(this); 74 74 return changesFromSnapshot(commitedValues); 75 75 } 76 76 77 -{{/ panel}}87 +{{/code}} 78 78 79 -=== Jonathan Rentzsch 89 +=== Jonathan Rentzsch === 80 80 81 81 Jonathan Rentzsch has provided his base EOGenerator templates, which are a must-have: 82 82 83 -http: ~/~/rentzsch.com/share/eogenerator52templates.zip93 +[[http://rentzsch.com/share/eogenerator52templates.zip]] 84 84 85 -=== Markus Ruggiero 95 +=== Markus Ruggiero === 86 86 87 87 Constants for all attributes and relationships. This allows compile time error checking in situations like 88 88 addObjecttoBothSidesOfRelationshipWithKey(myObject, Person.TO//MANY//Children) 89 89 90 -{{ panel}}100 +{{code}} 91 91 92 - 102 +<$foreach attribute classAttributes.@reversedArray do$> 93 93 public static final String ATTRIBUTE_<$attribute.name$> = "<$attribute.name$>";<$endforeach do$> 94 94 95 -{{/panel}} 96 - 97 97 <$foreach ToOneRelationship classToOneRelationships.@reversedArray do$> 98 - 99 -{{panel}} 100 - 101 101 public static final String TO_ONE_<$ToOneRelationship.name$> = "<$ToOneRelationship.name$>";<$endforeach do$> 102 102 103 -{{/panel}} 104 - 105 105 <$foreach ToManyRelationship classToManyRelationships.@reversedArray do$> 106 - 107 -{{panel}} 108 - 109 109 public static final String TO_MANY_<$ToManyRelationship.name$> = "<$ToManyRelationship.name$>";<$endforeach do$> 110 110 111 -{{/ panel}}111 +{{/code}} 112 112 113 113 We also make heavy use of the user info dictionary on entity and attribute level. Allows to generate customized methods and what not. One example is booleans that are stored in the DB as strings with values "true" and "false". 114 114 115 -{{ panel}}115 +{{code}} 116 116 117 - 117 +<$if attribute.userInfo.usage h1. booleanFlag $> // boolean accessors 118 118 public void <$attribute.userInfo.setterName$>(boolean newBoolean) { 119 119 set<$attribute.name.initialCapitalString$>(newBoolean ? "true" : "false"); 120 120 } 121 - 121 + 122 122 public boolean <$attribute.userInfo.getterName$>() { 123 123 return "true".equals(<$attribute.name$>()) ? true : false; 124 124 } 125 - 125 + 126 126 // validation 127 127 public String validate<$attribute.name.initialCapitalString$>(String newValue) { 128 128 if ( newValue null ) { ... ... @@ -135,69 +135,67 @@ 135 135 } 136 136 <$endif$> 137 137 138 -{{/ panel}}138 +{{/code}} 139 139 140 -=== Mike Schrag 140 +=== Mike Schrag === 141 141 142 142 Add a constant that represents the name of the entity so that you can refer to Person.ENTITY//NAME in fetches rather than the String (allows refactoring support in Eclipse)~:// 143 143 144 -{{ panel}}144 +{{code}} 145 145 146 - 146 +public static final String ENTITY_NAME = "<$name$>"; 147 147 148 -{{/ panel}}148 +{{/code}} 149 149 150 150 Add a static factory method to your EO's ( Person createPerson(...) ) that shows you what required attributes and relationships are configured for you entity (attempts to provide a replacement "constructor" since EO constructors are empty): 151 151 152 -{{ panel}}152 +{{code}} 153 153 154 - 155 - 156 - 157 - 158 - 159 - 154 +public static <$classNameWithoutPackage$> create<$classNameWithoutPackage$>(EOEditingContext _editingContext<$foreach Attribute classAttributes.@sortedNameArray do$><$if !Attribute.allowsNull$>, <$Attribute.javaValueClassName$> _<$Attribute.name$><$endif$><$endforeach do$><$foreach ToOneRelationship classToOneRelationships.@sortedNameArray do$><$if ToOneRelationship.isMandatory$>, <$ToOneRelationship.destinationEntity.referenceJavaClassName$> _<$ToOneRelationship.name$><$endif$><$endforeach do$>) { 155 + <$classNameWithoutPackage$> eoObject = (<$classNameWithoutPackage$>)EOUtilities.createAndInsertInstance(_editingContext, <$GEN_PREFIX$><$classNameWithoutPackage$>.ENTITY_NAME);<$foreach Attribute classAttributes.@sortedNameArray do$><$if !Attribute.allowsNull$> 156 + eoObject.set<$Attribute.name.initialCapitalString$>(_<$Attribute.name$>);<$endif$><$endforeach do$><$foreach ToOneRelationship classToOneRelationships.@sortedNameArray do$><$if ToOneRelationship.isMandatory$> 157 + eoObject.set<$ToOneRelationship.name.initialCapitalString$>Relationship(_<$ToOneRelationship.name$>);<$endif$><$endforeach do$> 158 + return eoObject; 159 +} 160 160 161 -{{/ panel}}161 +{{/code}} 162 162 163 163 Here's a little bitty fancier (read: nastier) version that also handles superclass mandatory attributes and fields (one level). It skips any attribute that is referenced in the restricting qualifier of your subclass (since you are probably going to set that in your awakeFromInsertion): 164 164 165 -{{ panel}}165 +{{code}} 166 166 167 - 168 - 169 - 170 - 171 - 172 - 173 - 174 - 167 +public static <$classNameWithoutPackage$> create<$classNameWithoutPackage$>(EOEditingContext editingContext<$foreach Attribute classAttributes.@sortedNameArray do$><$if !Attribute.allowsNull$>, <$Attribute.javaValueClassName$> <$Attribute.name$><$endif$><$endforeach do$><$foreach Attribute parentEntity.classAttributes.@sortedNameArray do$><$if !Attribute.allowsNull$><$set RestrictingQualifierKey = false$><$foreach QualifierKey restrictingQualifier.allQualifierKeys do$><$if Attribute.name = QualifierKey$><$set RestrictingQualifierKey = true$><$endif$><$endforeach do$><$if RestrictingQualifierKey = false$>, <$Attribute.javaValueClassName$> <$Attribute.name$><$endif$><$endif$><$endforeach do$><$foreach ToOneRelationship classToOneRelationships.@sortedNameArray do$><$if ToOneRelationship.isMandatory$>, <$ToOneRelationship.destinationEntity.referenceJavaClassName$> <$ToOneRelationship.name$><$endif$><$endforeach do$><$foreach ToOneRelationship parentEntity.classToOneRelationships.@sortedNameArray do$><$if ToOneRelationship.isMandatory$>, <$ToOneRelationship.destinationEntity.referenceJavaClassName$> <$ToOneRelationship.name$><$endif$><$endforeach do$>) { 168 + <$classNameWithoutPackage$> eoObject = (<$classNameWithoutPackage$>)EOUtilities.createAndInsertInstance(editingContext, <$GEN_PREFIX$><$classNameWithoutPackage$>.ENTITY_NAME);<$foreach Attribute classAttributes.@sortedNameArray do$><$if !Attribute.allowsNull$> 169 + eoObject.set<$Attribute.name.initialCapitalString$>(<$Attribute.name$>);<$endif$><$endforeach do$><$foreach ToOneRelationship classToOneRelationships.@sortedNameArray do$><$if ToOneRelationship.isMandatory$> 170 + eoObject.set<$ToOneRelationship.name.initialCapitalString$>Relationship(<$ToOneRelationship.name$>);<$endif$><$endforeach do$><$foreach Attribute parentEntity.classAttributes.@sortedNameArray do$><$if !Attribute.allowsNull$><$set RestrictingQualifierKey = false$><$foreach QualifierKey restrictingQualifier.allQualifierKeys do$><$if Attribute.name = QualifierKey$><$set RestrictingQualifierKey = true$><$endif$><$endforeach do$><$if RestrictingQualifierKey = false$> 171 + eoObject.set<$Attribute.name.initialCapitalString$>(<$Attribute.name$>);<$endif$><$endif$><$endforeach do$><$foreach ToOneRelationship parentEntity.classToOneRelationships.@sortedNameArray do$><$if ToOneRelationship.isMandatory$> 172 + eoObject.set<$ToOneRelationship.name.initialCapitalString$>Relationship(<$ToOneRelationship.name$>);<$endif$><$endforeach do$> 173 + return eoObject; 174 +} 175 175 176 -{{/ panel}}176 +{{/code}} 177 177 178 178 Add a bunch of convience fetch methods (fetchAllPersons, fetchRequiredPerson, and other variants). It's not smart about pluralization, so it's just going to put an "s" on the end of the entity name: 179 179 180 -{{ panel}}180 +{{code}} 181 181 182 - 182 +public static NSArray fetchAll<$classNameWithoutPackage$>s(EOEditingContext _editingContext) { 183 183 return <$GEN_PREFIX$><$classNameWithoutPackage$>.fetchAll<$classNameWithoutPackage$>s(_editingContext, null); 184 184 } 185 185 186 -{{/ panel}}186 +{{/code}} 187 187 188 - publicstatic NSArray fetchAll<$classNameWithoutPackage$>s(EOEditingContext //editingContext, NSArray //sortOrderings) {188 +{{code}} 189 189 190 -{{panel}} 191 - 190 +public static NSArray fetchAll<$classNameWithoutPackage$>s(EOEditingContext _editingContext, NSArray _sortOrderings) { 192 192 return <$GEN_PREFIX$><$classNameWithoutPackage$>.fetch<$classNameWithoutPackage$>s(_editingContext, null, _sortOrderings); 193 193 } 194 194 195 -{{/ panel}}194 +{{/code}} 196 196 197 - publicstatic NSArray fetch<$classNameWithoutPackage$>s(EOEditingContext //editingContext, EOQualifier //qualifier, NSArray //sortOrderings) {//196 +{{code}} 198 198 199 -{{panel}} 200 - 198 +public static NSArray fetch<$classNameWithoutPackage$>s(EOEditingContext _editingContext, EOQualifier _qualifier, NSArray _sortOrderings) { 201 201 EOFetchSpecification fetchSpec = new EOFetchSpecification(<$GEN_PREFIX$><$classNameWithoutPackage$>.ENTITY_NAME, _qualifier, _sortOrderings); 202 202 fetchSpec.setIsDeep(true); 203 203 NSArray eoObjects = _editingContext.objectsWithFetchSpecification(fetchSpec); ... ... @@ -204,21 +204,19 @@ 204 204 return eoObjects; 205 205 } 206 206 207 -{{/ panel}}205 +{{/code}} 208 208 209 - publicstatic <$classNameWithoutPackage$> fetch<$classNameWithoutPackage$>(EOEditingContext //editingContext, String //keyName, Object //value) {//207 +{{code}} 210 210 211 -{{panel}} 212 - 209 +public static <$classNameWithoutPackage$> fetch<$classNameWithoutPackage$>(EOEditingContext _editingContext, String _keyName, Object _value) { 213 213 return <$GEN_PREFIX$><$classNameWithoutPackage$>.fetch<$classNameWithoutPackage$>(_editingContext, new EOKeyValueQualifier(_keyName, EOQualifier.QualifierOperatorEqual, _value)); 214 214 } 215 215 216 -{{/ panel}}213 +{{/code}} 217 217 218 - publicstatic <$classNameWithoutPackage$> fetch<$classNameWithoutPackage$>(EOEditingContext //editingContext, EOQualifier //qualifier) {215 +{{code}} 219 219 220 -{{panel}} 221 - 217 +public static <$classNameWithoutPackage$> fetch<$classNameWithoutPackage$>(EOEditingContext _editingContext, EOQualifier _qualifier) { 222 222 NSArray eoObjects = <$GEN_PREFIX$><$classNameWithoutPackage$>.fetch<$classNameWithoutPackage$>s(_editingContext, _qualifier, null); 223 223 <$classNameWithoutPackage$> eoObject; 224 224 int count = eoObjects.count(); ... ... @@ -233,50 +233,52 @@ 233 233 } 234 234 return eoObject; 235 235 } 236 - 237 - public static <$classNameWithoutPackage$> fetchRequired<$classNameWithoutPackage$>(EOEditingContext _editingContext, String _keyName, Object _value) { 232 + 233 +{{/code}} 234 + 235 +{{code}} 236 + 237 +public static <$classNameWithoutPackage$> fetchRequired<$classNameWithoutPackage$>(EOEditingContext _editingContext, String _keyName, Object _value) { 238 238 return <$GEN_PREFIX$><$classNameWithoutPackage$>.fetchRequired<$classNameWithoutPackage$>(_editingContext, new EOKeyValueQualifier(_keyName, EOQualifier.QualifierOperatorEqual, _value)); 239 239 } 240 240 241 -{{/ panel}}241 +{{/code}} 242 242 243 - publicstatic <$classNameWithoutPackage$> fetchRequired<$classNameWithoutPackage$>(EOEditingContext //editingContext, EOQualifier //qualifier) {243 +{{code}} 244 244 245 -{{panel}} 246 - 245 +public static <$classNameWithoutPackage$> fetchRequired<$classNameWithoutPackage$>(EOEditingContext _editingContext, EOQualifier _qualifier) { 247 247 <$classNameWithoutPackage$> eoObject = <$GEN_PREFIX$><$classNameWithoutPackage$>.fetch<$classNameWithoutPackage$>(_editingContext, _qualifier); 248 - if (eoObject h1.null) {247 + if (eoObject == null) { 249 249 throw new NoSuchElementException("There was no <$classNameWithoutPackage$> that matched the qualifier '" + _qualifier + "'."); 250 250 } 251 251 return eoObject; 252 252 } 253 253 254 -{{/ panel}}253 +{{/code}} 255 255 256 256 Add methods for getting local instances of EO's. The static one is handy if you have a reference to an EO that might be null (it does a null check first): 257 257 258 -{{ panel}}257 +{{code}} 259 259 260 - 259 +public <$classNameWithoutPackage$> localInstanceOf<$classNameWithoutPackage$>(EOEditingContext _editingContext) { 261 261 return (<$classNameWithoutPackage$>)EOUtilities.localInstanceOfObject(_editingContext, this); 262 262 } 263 263 264 -{{/ panel}}263 +{{/code}} 265 265 266 - publicstatic <$classNameWithoutPackage$> localInstanceOf<$classNameWithoutPackage$>(EOEditingContext //editingContext, <$classNameWithoutPackage$> //eo) {265 +{{code}} 267 267 268 -{{panel}} 269 - 270 - return (_eo null) ? null : (<$classNameWithoutPackage$>)EOUtilities.localInstanceOfObject(_editingContext, _eo); 267 +public static <$classNameWithoutPackage$> localInstanceOf<$classNameWithoutPackage$>(EOEditingContext _editingContext, <$classNameWithoutPackage$> _eo) { 268 + return (_eo == null) ? null : (<$classNameWithoutPackage$>)EOUtilities.localInstanceOfObject(_editingContext, _eo); 271 271 } 272 272 273 -{{/ panel}}271 +{{/code}} 274 274 275 275 If you've ever wanted to be able to qualify a toMany relationship on your EO's, but sometimes you want to fetch them w/ a fetch spec, and sometimes you want to filter in-memory, you can use the following: 276 276 277 -{{ panel}}275 +{{code}} 278 278 279 - 277 +<$if !ToManyRelationship.inverseRelationship$> 280 280 public NSArray <$ToManyRelationship.name$>(EOQualifier qualifier) { 281 281 return <$ToManyRelationship.name$>(qualifier, null); 282 282 } ... ... @@ -285,18 +285,19 @@ 285 285 public NSArray <$ToManyRelationship.name$>(EOQualifier qualifier) { 286 286 return <$ToManyRelationship.name$>(qualifier, null, false); 287 287 } 288 - 289 - public NSArray <$ToManyRelationship.name$>(EOQualifier qualifier, boolean fetch) { 286 + 287 + public NSArray <$ToManyRelationship.name$>(EOQualifier qualifier, boolean fetch) { 290 290 return <$ToManyRelationship.name$>(qualifier, null, fetch); 291 291 } 292 292 <$endif$> 293 - 291 + 294 294 public NSArray <$ToManyRelationship.name$>(EOQualifier qualifier, NSArray sortOrderings<$if ToManyRelationship.inverseRelationship$>, boolean fetch<$endif$>) { 295 295 NSArray results; 296 296 <$if ToManyRelationship.inverseRelationship$> 297 297 if (fetch) { 298 298 EOQualifier fullQualifier; 299 - EOQualifier inverseQualifier = new EOKeyValueQualifier(<$ToManyRelationship.destination.className$>.<$ToManyRelationship.inverseRelationship.name.uppercaseUnderbarString$>_KEY, EOQualifier.QualifierOperatorEqual, this); 297 + EOQualifier inverseQualifier = new EOKeyValueQualifier(<$ToManyRelationship.destination.className$>. 298 + <$ToManyRelationship.inverseRelationship.name.uppercaseUnderbarString$>_KEY, EOQualifier.QualifierOperatorEqual, this); 300 300 if (qualifier == null) { 301 301 fullQualifier = inverseQualifier; 302 302 } ... ... @@ -323,36 +323,34 @@ 323 323 return results; 324 324 } 325 325 326 -{{/ panel}}325 +{{/code}} 327 327 328 -=== John Huss 327 +=== John Huss === 329 329 330 -I wanted to share a wonderful bit of knowledge I learned today. If you're using Java 1.5 you can add @SuppressWarnings("all") to the template for your //EO base classes and eliminate annoying compiler messages (usually uneeded import statements).//329 +I wanted to share a wonderful bit of knowledge I learned today. If you're using Java 1.5 you can add @SuppressWarnings("all") to the template for your EO base classes and eliminate annoying compiler messages (usually uneeded import statements). 331 331 332 -{{ panel}}331 +{{code}} 333 333 334 - 333 +@SuppressWarnings("all") 335 335 public class _Invoice extends ERXGenericRecord { 336 336 } 337 337 338 -{{/ panel}}337 +{{/code}} 339 339 340 -=== Guido Neitzer 339 +=== Guido Neitzer === 341 341 342 342 Create awakeFromInsertion() and awakeFromFetch() in your EOGenerator template as a method stub that only calls super() and has a comment for "initialize your object here ...". You only have to put in the code at that place and can't possibly forget to call super(). Here is an example: 343 343 344 -{{ panel}}343 +{{code}} 345 345 346 - 347 - 348 - 349 - 350 - 351 - 352 - 345 +/** 346 + * Initialization of the instance while inserting it into an editing context 347 + */ 348 +public void awakeFromInsertion (EOEditingContext editingContext) { 349 + super.awakeFromInsertion (editingContext); 350 + // initialize your object here 351 +} 353 353 354 -{{/ panel}}353 +{{/code}} 355 355 356 356 This is from my JavaSubclassSourceTemplate.eotemplate 357 - 358 -Category:WebObjects