Id in domain model in case when natural id is unavailableTechniques for dealing with anemic domain modelCorrect use of flush() in JPA/Hibernate.NET Domain Model validation and Buddy ClassesRich Domain Model and ORMUsing my own domain model objects with .edmx in Entity FrameworkDoctrine Entities and business logic in a Symfony applicationRepository pattern and mapping between domain models and Entity FrameworkHow to write domain logic for a domain model in Domain Driven Design?Persistance ID's and Domain Model EntitiesHaving Separate Domain Model and Persistence Model in DDD
Why didn’t Eve recognize the little cockroach as a living organism?
Trouble reading roman numeral notation with flats
Do native speakers use "ultima" and "proxima" frequently in spoken English?
How do you say "Trust your struggle." in French?
Reason why a kingside attack is not justified
Does capillary rise violate hydrostatic paradox?
Strange behavior in TikZ draw command
Is this saw blade faulty?
Derivative of an interpolated function
How to preserve electronics (computers, ipads, phones) for hundreds of years?
How can I, as DM, avoid the Conga Line of Death occurring when implementing some form of flanking rule?
Was Woodrow Wilson really a Liberal?
Why does the frost depth increase when the surface temperature warms up?
What (if any) is the reason to buy in small local stores?
Connection Between Knot Theory and Number Theory
Friend wants my recommendation but I don't want to give it to him
How do you justify more code being written by following clean code practices?
Checking @@ROWCOUNT failing
Asserting that Atheism and Theism are both faith based positions
Started in 1987 vs. Starting in 1987
Taking my research idea outside my paid job
Can a Knock spell open the door to Mordenkainen's Magnificent Mansion?
If the Dominion rule using their Jem'Hadar troops, why is their life expectancy so low?
Why is indicated airspeed rather than ground speed used during the takeoff roll?
Id in domain model in case when natural id is unavailable
Techniques for dealing with anemic domain modelCorrect use of flush() in JPA/Hibernate.NET Domain Model validation and Buddy ClassesRich Domain Model and ORMUsing my own domain model objects with .edmx in Entity FrameworkDoctrine Entities and business logic in a Symfony applicationRepository pattern and mapping between domain models and Entity FrameworkHow to write domain logic for a domain model in Domain Driven Design?Persistance ID's and Domain Model EntitiesHaving Separate Domain Model and Persistence Model in DDD
Let's say I have a domain model with no natural id.
class Offer
ClientId clientId;
CompanyId companyId;
OfferDetails details;
Offer is loaded from database by auto-generated key. Then it is modifed e.g. by calling a business method accept, reject or renegotiate. In order to persist the offer I must have this auto-generated key. How should I connect domain entity and id from db? Right now I have an OfferId class with db id and version (I use JPA to persist the aggregate). Is there any better approach?
domain-driven-design persistence
add a comment |
Let's say I have a domain model with no natural id.
class Offer
ClientId clientId;
CompanyId companyId;
OfferDetails details;
Offer is loaded from database by auto-generated key. Then it is modifed e.g. by calling a business method accept, reject or renegotiate. In order to persist the offer I must have this auto-generated key. How should I connect domain entity and id from db? Right now I have an OfferId class with db id and version (I use JPA to persist the aggregate). Is there any better approach?
domain-driven-design persistence
add a comment |
Let's say I have a domain model with no natural id.
class Offer
ClientId clientId;
CompanyId companyId;
OfferDetails details;
Offer is loaded from database by auto-generated key. Then it is modifed e.g. by calling a business method accept, reject or renegotiate. In order to persist the offer I must have this auto-generated key. How should I connect domain entity and id from db? Right now I have an OfferId class with db id and version (I use JPA to persist the aggregate). Is there any better approach?
domain-driven-design persistence
Let's say I have a domain model with no natural id.
class Offer
ClientId clientId;
CompanyId companyId;
OfferDetails details;
Offer is loaded from database by auto-generated key. Then it is modifed e.g. by calling a business method accept, reject or renegotiate. In order to persist the offer I must have this auto-generated key. How should I connect domain entity and id from db? Right now I have an OfferId class with db id and version (I use JPA to persist the aggregate). Is there any better approach?
domain-driven-design persistence
domain-driven-design persistence
asked Mar 7 at 20:12
Julian RubinJulian Rubin
636617
636617
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
Right now I have an OfferId class with db id and version
The version shouldn't be part of the ID. The ID needs to be immutable.
There are several strategies to deal with ID generation, but here's the common ones:
- Use a GUID which relieves the need to hit a shared data store to generate the ID.
Implement a
nextId(): OfferIdoperation on your repository (implementation could use a DB sequence, etc.):Offer offer = new Offer(offerRepo.nextId(), ...);- Allow the
Offerclass to be instantiated without an ID and configure your ORM to generate one. I'm not entirely sure about the JPA spec, but it seems that in Hibernate you can combine@IdClassand@GenerateValueannotations to map a DB-generated identity to a wrapping ID class. Have a look at this test case.
Honestly I dislike delegating the identity assignation/generation to the ORM. If you want to generate the ID from the DB I would suggest the second approach I've described, with a method on the repository (or a dedicated service) that can return the next ID.
I like nextId approach. How would You suggest handling version?
– Julian Rubin
Mar 8 at 14:38
@JulianRubin Just use an integer withinOfferand let it be managed by the ORM. You can declare that field in a layer supertype, such asEntityrather than polluting all model classes.Offer extends Entity.
– plalx
Mar 8 at 14:46
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55052077%2fid-in-domain-model-in-case-when-natural-id-is-unavailable%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
Right now I have an OfferId class with db id and version
The version shouldn't be part of the ID. The ID needs to be immutable.
There are several strategies to deal with ID generation, but here's the common ones:
- Use a GUID which relieves the need to hit a shared data store to generate the ID.
Implement a
nextId(): OfferIdoperation on your repository (implementation could use a DB sequence, etc.):Offer offer = new Offer(offerRepo.nextId(), ...);- Allow the
Offerclass to be instantiated without an ID and configure your ORM to generate one. I'm not entirely sure about the JPA spec, but it seems that in Hibernate you can combine@IdClassand@GenerateValueannotations to map a DB-generated identity to a wrapping ID class. Have a look at this test case.
Honestly I dislike delegating the identity assignation/generation to the ORM. If you want to generate the ID from the DB I would suggest the second approach I've described, with a method on the repository (or a dedicated service) that can return the next ID.
I like nextId approach. How would You suggest handling version?
– Julian Rubin
Mar 8 at 14:38
@JulianRubin Just use an integer withinOfferand let it be managed by the ORM. You can declare that field in a layer supertype, such asEntityrather than polluting all model classes.Offer extends Entity.
– plalx
Mar 8 at 14:46
add a comment |
Right now I have an OfferId class with db id and version
The version shouldn't be part of the ID. The ID needs to be immutable.
There are several strategies to deal with ID generation, but here's the common ones:
- Use a GUID which relieves the need to hit a shared data store to generate the ID.
Implement a
nextId(): OfferIdoperation on your repository (implementation could use a DB sequence, etc.):Offer offer = new Offer(offerRepo.nextId(), ...);- Allow the
Offerclass to be instantiated without an ID and configure your ORM to generate one. I'm not entirely sure about the JPA spec, but it seems that in Hibernate you can combine@IdClassand@GenerateValueannotations to map a DB-generated identity to a wrapping ID class. Have a look at this test case.
Honestly I dislike delegating the identity assignation/generation to the ORM. If you want to generate the ID from the DB I would suggest the second approach I've described, with a method on the repository (or a dedicated service) that can return the next ID.
I like nextId approach. How would You suggest handling version?
– Julian Rubin
Mar 8 at 14:38
@JulianRubin Just use an integer withinOfferand let it be managed by the ORM. You can declare that field in a layer supertype, such asEntityrather than polluting all model classes.Offer extends Entity.
– plalx
Mar 8 at 14:46
add a comment |
Right now I have an OfferId class with db id and version
The version shouldn't be part of the ID. The ID needs to be immutable.
There are several strategies to deal with ID generation, but here's the common ones:
- Use a GUID which relieves the need to hit a shared data store to generate the ID.
Implement a
nextId(): OfferIdoperation on your repository (implementation could use a DB sequence, etc.):Offer offer = new Offer(offerRepo.nextId(), ...);- Allow the
Offerclass to be instantiated without an ID and configure your ORM to generate one. I'm not entirely sure about the JPA spec, but it seems that in Hibernate you can combine@IdClassand@GenerateValueannotations to map a DB-generated identity to a wrapping ID class. Have a look at this test case.
Honestly I dislike delegating the identity assignation/generation to the ORM. If you want to generate the ID from the DB I would suggest the second approach I've described, with a method on the repository (or a dedicated service) that can return the next ID.
Right now I have an OfferId class with db id and version
The version shouldn't be part of the ID. The ID needs to be immutable.
There are several strategies to deal with ID generation, but here's the common ones:
- Use a GUID which relieves the need to hit a shared data store to generate the ID.
Implement a
nextId(): OfferIdoperation on your repository (implementation could use a DB sequence, etc.):Offer offer = new Offer(offerRepo.nextId(), ...);- Allow the
Offerclass to be instantiated without an ID and configure your ORM to generate one. I'm not entirely sure about the JPA spec, but it seems that in Hibernate you can combine@IdClassand@GenerateValueannotations to map a DB-generated identity to a wrapping ID class. Have a look at this test case.
Honestly I dislike delegating the identity assignation/generation to the ORM. If you want to generate the ID from the DB I would suggest the second approach I've described, with a method on the repository (or a dedicated service) that can return the next ID.
answered Mar 8 at 14:29
plalxplalx
33.2k44770
33.2k44770
I like nextId approach. How would You suggest handling version?
– Julian Rubin
Mar 8 at 14:38
@JulianRubin Just use an integer withinOfferand let it be managed by the ORM. You can declare that field in a layer supertype, such asEntityrather than polluting all model classes.Offer extends Entity.
– plalx
Mar 8 at 14:46
add a comment |
I like nextId approach. How would You suggest handling version?
– Julian Rubin
Mar 8 at 14:38
@JulianRubin Just use an integer withinOfferand let it be managed by the ORM. You can declare that field in a layer supertype, such asEntityrather than polluting all model classes.Offer extends Entity.
– plalx
Mar 8 at 14:46
I like nextId approach. How would You suggest handling version?
– Julian Rubin
Mar 8 at 14:38
I like nextId approach. How would You suggest handling version?
– Julian Rubin
Mar 8 at 14:38
@JulianRubin Just use an integer within
Offer and let it be managed by the ORM. You can declare that field in a layer supertype, such as Entity rather than polluting all model classes. Offer extends Entity.– plalx
Mar 8 at 14:46
@JulianRubin Just use an integer within
Offer and let it be managed by the ORM. You can declare that field in a layer supertype, such as Entity rather than polluting all model classes. Offer extends Entity.– plalx
Mar 8 at 14:46
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55052077%2fid-in-domain-model-in-case-when-natural-id-is-unavailable%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown