Hibernate check if entity has changed












0















I have two applications - Server that has connection with database and Client which doesn't. Server loads entity and sends it to Client. Client edits it and sends it back so that Server can update it. But... there are many Clients and many of them can edit that entity and want to update it with their own value but I want Server to update it only if it hasn't been updated since it had been send to Client. Namely: Clients try to set ticket's status to their own value but only if current status in database is the same that it was when that Client received it. Currently I have it like that:



public boolean changeStatus (Ticket ticket, short newStatus) {
short previousStatus = ticket.getStatus();
boolean result = false;
Session session = sessionFactory.openSession();
Transaction tx = null;

try {
tx = session.beginTransaction();

String sql = "UPDATE ticket SET status = :newStatus WHERE idTicket = :idTicket AND status = :previousStatus";
NativeQuery query = session.createSQLQuery(sql);

query.setParameter("idTicket", ticket.getIdTicket());
query.setParameter("newStatus", newStatus);
query.setParameter("previousStatus", previousStatus);
result = query.executeUpdate() == 1;


but sometimes I also want to set other atributes and check if other atributes hasn't changed and using that method would make it very ugly and I want it to be more object-oriented not plain sql. Any suggestions?



Forgot to mention that each Client has it's own Server thread that might try to update










share|improve this question

























  • I guess you can check versioning topic for Hibernate to solve your problem.

    – Kamil
    Jan 18 at 19:59











  • The most common pattern is called Optimistic Locking

    – Antoniossss
    Jan 18 at 20:37











  • Have a look at docs.jboss.org/hibernate/orm/5.4/userguide/html_single/… - specially 10.1.1. Mapping optimistic locking

    – drkunibar
    Jan 18 at 23:44


















0















I have two applications - Server that has connection with database and Client which doesn't. Server loads entity and sends it to Client. Client edits it and sends it back so that Server can update it. But... there are many Clients and many of them can edit that entity and want to update it with their own value but I want Server to update it only if it hasn't been updated since it had been send to Client. Namely: Clients try to set ticket's status to their own value but only if current status in database is the same that it was when that Client received it. Currently I have it like that:



public boolean changeStatus (Ticket ticket, short newStatus) {
short previousStatus = ticket.getStatus();
boolean result = false;
Session session = sessionFactory.openSession();
Transaction tx = null;

try {
tx = session.beginTransaction();

String sql = "UPDATE ticket SET status = :newStatus WHERE idTicket = :idTicket AND status = :previousStatus";
NativeQuery query = session.createSQLQuery(sql);

query.setParameter("idTicket", ticket.getIdTicket());
query.setParameter("newStatus", newStatus);
query.setParameter("previousStatus", previousStatus);
result = query.executeUpdate() == 1;


but sometimes I also want to set other atributes and check if other atributes hasn't changed and using that method would make it very ugly and I want it to be more object-oriented not plain sql. Any suggestions?



Forgot to mention that each Client has it's own Server thread that might try to update










share|improve this question

























  • I guess you can check versioning topic for Hibernate to solve your problem.

    – Kamil
    Jan 18 at 19:59











  • The most common pattern is called Optimistic Locking

    – Antoniossss
    Jan 18 at 20:37











  • Have a look at docs.jboss.org/hibernate/orm/5.4/userguide/html_single/… - specially 10.1.1. Mapping optimistic locking

    – drkunibar
    Jan 18 at 23:44
















0












0








0








I have two applications - Server that has connection with database and Client which doesn't. Server loads entity and sends it to Client. Client edits it and sends it back so that Server can update it. But... there are many Clients and many of them can edit that entity and want to update it with their own value but I want Server to update it only if it hasn't been updated since it had been send to Client. Namely: Clients try to set ticket's status to their own value but only if current status in database is the same that it was when that Client received it. Currently I have it like that:



public boolean changeStatus (Ticket ticket, short newStatus) {
short previousStatus = ticket.getStatus();
boolean result = false;
Session session = sessionFactory.openSession();
Transaction tx = null;

try {
tx = session.beginTransaction();

String sql = "UPDATE ticket SET status = :newStatus WHERE idTicket = :idTicket AND status = :previousStatus";
NativeQuery query = session.createSQLQuery(sql);

query.setParameter("idTicket", ticket.getIdTicket());
query.setParameter("newStatus", newStatus);
query.setParameter("previousStatus", previousStatus);
result = query.executeUpdate() == 1;


but sometimes I also want to set other atributes and check if other atributes hasn't changed and using that method would make it very ugly and I want it to be more object-oriented not plain sql. Any suggestions?



Forgot to mention that each Client has it's own Server thread that might try to update










share|improve this question
















I have two applications - Server that has connection with database and Client which doesn't. Server loads entity and sends it to Client. Client edits it and sends it back so that Server can update it. But... there are many Clients and many of them can edit that entity and want to update it with their own value but I want Server to update it only if it hasn't been updated since it had been send to Client. Namely: Clients try to set ticket's status to their own value but only if current status in database is the same that it was when that Client received it. Currently I have it like that:



public boolean changeStatus (Ticket ticket, short newStatus) {
short previousStatus = ticket.getStatus();
boolean result = false;
Session session = sessionFactory.openSession();
Transaction tx = null;

try {
tx = session.beginTransaction();

String sql = "UPDATE ticket SET status = :newStatus WHERE idTicket = :idTicket AND status = :previousStatus";
NativeQuery query = session.createSQLQuery(sql);

query.setParameter("idTicket", ticket.getIdTicket());
query.setParameter("newStatus", newStatus);
query.setParameter("previousStatus", previousStatus);
result = query.executeUpdate() == 1;


but sometimes I also want to set other atributes and check if other atributes hasn't changed and using that method would make it very ugly and I want it to be more object-oriented not plain sql. Any suggestions?



Forgot to mention that each Client has it's own Server thread that might try to update







java hibernate






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Jan 18 at 19:09







J.Doe

















asked Jan 18 at 18:59









J.DoeJ.Doe

11




11













  • I guess you can check versioning topic for Hibernate to solve your problem.

    – Kamil
    Jan 18 at 19:59











  • The most common pattern is called Optimistic Locking

    – Antoniossss
    Jan 18 at 20:37











  • Have a look at docs.jboss.org/hibernate/orm/5.4/userguide/html_single/… - specially 10.1.1. Mapping optimistic locking

    – drkunibar
    Jan 18 at 23:44





















  • I guess you can check versioning topic for Hibernate to solve your problem.

    – Kamil
    Jan 18 at 19:59











  • The most common pattern is called Optimistic Locking

    – Antoniossss
    Jan 18 at 20:37











  • Have a look at docs.jboss.org/hibernate/orm/5.4/userguide/html_single/… - specially 10.1.1. Mapping optimistic locking

    – drkunibar
    Jan 18 at 23:44



















I guess you can check versioning topic for Hibernate to solve your problem.

– Kamil
Jan 18 at 19:59





I guess you can check versioning topic for Hibernate to solve your problem.

– Kamil
Jan 18 at 19:59













The most common pattern is called Optimistic Locking

– Antoniossss
Jan 18 at 20:37





The most common pattern is called Optimistic Locking

– Antoniossss
Jan 18 at 20:37













Have a look at docs.jboss.org/hibernate/orm/5.4/userguide/html_single/… - specially 10.1.1. Mapping optimistic locking

– drkunibar
Jan 18 at 23:44







Have a look at docs.jboss.org/hibernate/orm/5.4/userguide/html_single/… - specially 10.1.1. Mapping optimistic locking

– drkunibar
Jan 18 at 23:44














0






active

oldest

votes











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
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54259973%2fhibernate-check-if-entity-has-changed%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























0






active

oldest

votes








0






active

oldest

votes









active

oldest

votes






active

oldest

votes
















draft saved

draft discarded




















































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.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54259973%2fhibernate-check-if-entity-has-changed%23new-answer', 'question_page');
}
);

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







Popular posts from this blog

Liquibase includeAll doesn't find base path

How to use setInterval in EJS file?

Petrus Granier-Deferre