{"id":58689,"date":"2016-07-22T22:00:48","date_gmt":"2016-07-22T19:00:48","guid":{"rendered":"https:\/\/www.javacodegeeks.com\/?p=58689"},"modified":"2016-07-22T16:22:27","modified_gmt":"2016-07-22T13:22:27","slug":"reference-identity-jpa","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2016\/07\/reference-identity-jpa.html","title":{"rendered":"Reference by Identity in JPA"},"content":{"rendered":"<p>In a <a href=\"http:\/\/lorenzo-dee.blogspot.gr\/2013\/05\/domain-driven-design-referencing.html\">previous post<\/a>, I mentioned that I opted to reference other aggregates by their primary key, and not by type. I usually use this approach (a.k.a. disconnected domain model) when working with large or complex domain models. In this post, let me <em>try<\/em> to explain further how it can be done in <abbr>JPA<\/abbr>. Note that the resulting <abbr>DDL<\/abbr> scripts will not create a foreign key constraint (unlike the one shown in the <a href=\"http:\/\/lorenzo-dee.blogspot.gr\/2013\/05\/domain-driven-design-referencing.html\">previous post<\/a>).<\/p>\n<h2>Reference by Identity<\/h2>\n<p>In most JPA examples, every entity references another entity, or is being referenced by another entity. This results into an object model that allows traversal from one entity to any other entity. This can cause <em>unwanted traversals<\/em> (and unwanted cascade of persistence operations). As such, it would be good to prevent this, by referencing other entities by ID (and not by type).<\/p>\n<p>The code below shows how <code>OrderItem<\/code> references a <code>Product<\/code> entity by its primary key (and not by type).<\/p>\n<pre class=\"brush:java\">@Entity\r\npublic class Product {\r\n @Id private Long id;\r\n \/\/ ...\r\n}\r\n\r\n@Entity\r\npublic class Order {\r\n \/\/ ...\r\n @OneToMany(mappedBy=\"order\")\r\n private Collection&lt;OrderItem&gt; items;\r\n}\r\n\r\n@Entity\r\npublic class OrderItem {\r\n \/\/ ...\r\n @ManyToOne\r\n private Order order;\r\n \/\/ @ManyToOne\r\n \/\/ private Product product;\r\n private Long productId;\r\n \/\/ ...\r\n}<\/pre>\n<p>There are several ways to get the associated <code>Product<\/code> entities. One way is to use a repository to find products given the IDs (<code>ProductRepository<\/code> with a <code>findByIdIn(List&lt;Long&gt; ids)<\/code> method). As mentioned in previous comments, please be careful not to end up with the <em>N+1 selects problem<\/em>.<div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<p>Custom identity types can also be used. The example below uses <code>ProductId<\/code>. It is a value object. And because of JPA, we needed to add a zero-arguments constructor.<\/p>\n<pre class=\"brush:java\">@Embeddable\r\npublic class ProductId {\r\n private Long id;\r\n public ProductId(long id) {\r\n  this.id = id;\r\n }\r\n public long getValue() { return id; }\r\n \/\/ equals and hashCode\r\n protected ProductId() { \/* as required by JPA *\/ }\r\n}\r\n\r\n@Entity\r\npublic class Product {\r\n @EmbeddedId private ProductId id;\r\n \/\/ ...\r\n}\r\n\r\n@Entity\r\npublic class Order { \/\/ ...\r\n @OneToMany(mappedBy=\"order\")\r\n private Collection&lt;OrderItem&gt; items;\r\n}\r\n\r\n@Entity\r\npublic class OrderItem {\r\n \/\/ ...\r\n @ManyToOne\r\n private Order order;\r\n \/\/ @ManyToOne\r\n \/\/ private Product product;\r\n @Embedded private ProductId productId;\r\n \/\/ ...\r\n}<\/pre>\n<p>But this will not work if you&#8217;re using generated values for IDs. Fortunately, starting with JPA 2.0, there are some tricks around this, which I&#8217;ll share in the next section.<\/p>\n<h2>Generated IDs<\/h2>\n<p>In JPA, when using non-<code>@Basic<\/code> types as <code>@Id<\/code>, we can no longer use <code>@GeneratedValue<\/code>. But using a mix of property and field access, we can still use generated value and <code>ProductId<\/code>.<\/p>\n<pre class=\"brush:java\">@Embeddable\r\n@Access(AccessType.FIELD)\r\npublic class ProductId {...}\r\n\r\n@Entity\r\n@Access(AccessType.FIELD)\r\npublic class Product {\r\n @Transient private ProductId id;\r\n public ProductId getId() { return id; }\r\n \/\/ ...\r\n private Long id_;\r\n @Id\r\n @GeneratedValue(strategy=...)\r\n @Access(AccessType.PROPERTY)\r\n protected Long getId_() { return id_; }\r\n protected void setId_(Long id_) {\r\n  this.id_ = id_;\r\n  this.id = new ProductId(this.id_);\r\n }\r\n}\r\n\r\n@Entity\r\npublic class Order { \/\/ ...\r\n @OneToMany(mappedBy=\"order\")\r\n private Collection&lt;OrderItem&gt; items;\r\n}\r\n\r\n@Entity\r\npublic class OrderItem {\r\n \/\/ ...\r\n @ManyToOne\r\n private Order order;\r\n \/\/ @ManyToOne\r\n \/\/ private Product product;\r\n @Embedded private ProductId productId;\r\n \/\/ ...\r\n}<\/pre>\n<p>The trick involves using property access for the generated ID value (while keeping the rest with field access). This causes JPA to use the setter method. And in it, we initialize the <code>ProductId<\/code> field. Note that the <code>ProductId<\/code> field is not persisted (marked as <code>@Transient<\/code>).<\/p>\n<p>Hope this helps.<\/p>\n<div class=\"attribution\">\n<table>\n<tbody>\n<tr>\n<td><span class=\"reference\">Reference: <\/span><\/td>\n<td><a href=\"http:\/\/lorenzo-dee.blogspot.com\/2016\/07\/reference-by-identity-in-jpa.html\">Reference by Identity in JPA<\/a> from our <a href=\"http:\/\/www.javacodegeeks.com\/join-us\/jcg\/\">JCG partner<\/a> Lorenzo Dee at the <a href=\"http:\/\/lorenzo-dee.blogspot.com\/\">Adapting and Learning<\/a> blog.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>In a previous post, I mentioned that I opted to reference other aggregates by their primary key, and not by type. I usually use this approach (a.k.a. disconnected domain model) when working with large or complex domain models. In this post, let me try to explain further how it can be done in JPA. Note &hellip;<\/p>\n","protected":false},"author":998,"featured_media":112,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[33],"class_list":["post-58689","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-enterprise-java","tag-jpa"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Reference by Identity in JPA - Java Code Geeks<\/title>\n<meta name=\"description\" content=\"In a previous post, I mentioned that I opted to reference other aggregates by their primary key, and not by type. I usually use this approach (a.k.a.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.javacodegeeks.com\/2016\/07\/reference-identity-jpa.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Reference by Identity in JPA - Java Code Geeks\" \/>\n<meta property=\"og:description\" content=\"In a previous post, I mentioned that I opted to reference other aggregates by their primary key, and not by type. I usually use this approach (a.k.a.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2016\/07\/reference-identity-jpa.html\" \/>\n<meta property=\"og:site_name\" content=\"Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2016-07-22T19:00:48+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Lorenzo Dee\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Lorenzo Dee\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/07\\\/reference-identity-jpa.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/07\\\/reference-identity-jpa.html\"},\"author\":{\"name\":\"Lorenzo Dee\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/cbe847ac79d631cc30453be020e1c923\"},\"headline\":\"Reference by Identity in JPA\",\"datePublished\":\"2016-07-22T19:00:48+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/07\\\/reference-identity-jpa.html\"},\"wordCount\":356,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/07\\\/reference-identity-jpa.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"keywords\":[\"JPA\"],\"articleSection\":[\"Enterprise Java\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/07\\\/reference-identity-jpa.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/07\\\/reference-identity-jpa.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/07\\\/reference-identity-jpa.html\",\"name\":\"Reference by Identity in JPA - Java Code Geeks\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/07\\\/reference-identity-jpa.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/07\\\/reference-identity-jpa.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"datePublished\":\"2016-07-22T19:00:48+00:00\",\"description\":\"In a previous post, I mentioned that I opted to reference other aggregates by their primary key, and not by type. I usually use this approach (a.k.a.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/07\\\/reference-identity-jpa.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/07\\\/reference-identity-jpa.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/07\\\/reference-identity-jpa.html#primaryimage\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"width\":150,\"height\":150,\"caption\":\"java-interview-questions-answers\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/07\\\/reference-identity-jpa.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Enterprise Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\\\/enterprise-java\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Reference by Identity in JPA\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Developers Resource Center\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.javacodegeeks.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/javacodegeeks\",\"https:\\\/\\\/x.com\\\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/cbe847ac79d631cc30453be020e1c923\",\"name\":\"Lorenzo Dee\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/b52de1a36cee22cee60fc7e87232dde957d66b0f4cbcb50c23d58acbaaff4114?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/b52de1a36cee22cee60fc7e87232dde957d66b0f4cbcb50c23d58acbaaff4114?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/b52de1a36cee22cee60fc7e87232dde957d66b0f4cbcb50c23d58acbaaff4114?s=96&d=mm&r=g\",\"caption\":\"Lorenzo Dee\"},\"description\":\"Lorenzo is a software engineer, trainer, manager, and entrepreneur, who loves developing software systems that make people and organizations productive, profitable, and happy. He is a co-founder of the now dormant Haybol.ph, a Philippine real estate search site. He loves drinking coffee, root beer, and milk shakes.\",\"sameAs\":[\"http:\\\/\\\/lorenzo-dee.blogspot.gr\\\/\"],\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/author\\\/lorenzo-dee\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Reference by Identity in JPA - Java Code Geeks","description":"In a previous post, I mentioned that I opted to reference other aggregates by their primary key, and not by type. I usually use this approach (a.k.a.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.javacodegeeks.com\/2016\/07\/reference-identity-jpa.html","og_locale":"en_US","og_type":"article","og_title":"Reference by Identity in JPA - Java Code Geeks","og_description":"In a previous post, I mentioned that I opted to reference other aggregates by their primary key, and not by type. I usually use this approach (a.k.a.","og_url":"https:\/\/www.javacodegeeks.com\/2016\/07\/reference-identity-jpa.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2016-07-22T19:00:48+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","type":"image\/jpeg"}],"author":"Lorenzo Dee","twitter_card":"summary_large_image","twitter_creator":"@javacodegeeks","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Lorenzo Dee","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2016\/07\/reference-identity-jpa.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2016\/07\/reference-identity-jpa.html"},"author":{"name":"Lorenzo Dee","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/cbe847ac79d631cc30453be020e1c923"},"headline":"Reference by Identity in JPA","datePublished":"2016-07-22T19:00:48+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2016\/07\/reference-identity-jpa.html"},"wordCount":356,"commentCount":0,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2016\/07\/reference-identity-jpa.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","keywords":["JPA"],"articleSection":["Enterprise Java"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javacodegeeks.com\/2016\/07\/reference-identity-jpa.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2016\/07\/reference-identity-jpa.html","url":"https:\/\/www.javacodegeeks.com\/2016\/07\/reference-identity-jpa.html","name":"Reference by Identity in JPA - Java Code Geeks","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2016\/07\/reference-identity-jpa.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2016\/07\/reference-identity-jpa.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","datePublished":"2016-07-22T19:00:48+00:00","description":"In a previous post, I mentioned that I opted to reference other aggregates by their primary key, and not by type. I usually use this approach (a.k.a.","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2016\/07\/reference-identity-jpa.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2016\/07\/reference-identity-jpa.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2016\/07\/reference-identity-jpa.html#primaryimage","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","width":150,"height":150,"caption":"java-interview-questions-answers"},{"@type":"BreadcrumbList","@id":"https:\/\/www.javacodegeeks.com\/2016\/07\/reference-identity-jpa.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Java","item":"https:\/\/www.javacodegeeks.com\/category\/java"},{"@type":"ListItem","position":3,"name":"Enterprise Java","item":"https:\/\/www.javacodegeeks.com\/category\/java\/enterprise-java"},{"@type":"ListItem","position":4,"name":"Reference by Identity in JPA"}]},{"@type":"WebSite","@id":"https:\/\/www.javacodegeeks.com\/#website","url":"https:\/\/www.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Developers Resource Center","publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/cbe847ac79d631cc30453be020e1c923","name":"Lorenzo Dee","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/b52de1a36cee22cee60fc7e87232dde957d66b0f4cbcb50c23d58acbaaff4114?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/b52de1a36cee22cee60fc7e87232dde957d66b0f4cbcb50c23d58acbaaff4114?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/b52de1a36cee22cee60fc7e87232dde957d66b0f4cbcb50c23d58acbaaff4114?s=96&d=mm&r=g","caption":"Lorenzo Dee"},"description":"Lorenzo is a software engineer, trainer, manager, and entrepreneur, who loves developing software systems that make people and organizations productive, profitable, and happy. He is a co-founder of the now dormant Haybol.ph, a Philippine real estate search site. He loves drinking coffee, root beer, and milk shakes.","sameAs":["http:\/\/lorenzo-dee.blogspot.gr\/"],"url":"https:\/\/www.javacodegeeks.com\/author\/lorenzo-dee"}]}},"_links":{"self":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/58689","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/users\/998"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=58689"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/58689\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media\/112"}],"wp:attachment":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=58689"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=58689"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=58689"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}