From 664a9d568ac22b7654f78cefca3acc35f7d1cac5 Mon Sep 17 00:00:00 2001 From: Vlad Mihalcea Date: Mon, 26 Jun 2017 14:47:43 +0300 Subject: [PATCH] HHH-11837 - MapsId and PrimaryKeyJoinColumn examples in the documentation should use OneToOne rather than ManyToOne --- ...siteIdAssociationPrimaryKeyJoinColumn.java | 29 ---- .../domain/extras/id/DerivedIdentifier.java | 53 ------- .../chapters/domain/identifiers.adoc | 18 ++- .../associations/OneToOneMapsIdTest.java | 126 ++++++++++++++++ .../OneToOnePrimaryKeyJoinColumnTest.java | 136 ++++++++++++++++++ .../userguide/persister/PersisterTest.java | 53 ------- 6 files changed, 277 insertions(+), 138 deletions(-) delete mode 100644 documentation/src/main/asciidoc/userguide/chapters/domain/extras/id/CompositeIdAssociationPrimaryKeyJoinColumn.java delete mode 100644 documentation/src/main/asciidoc/userguide/chapters/domain/extras/id/DerivedIdentifier.java create mode 100644 documentation/src/test/java/org/hibernate/userguide/associations/OneToOneMapsIdTest.java create mode 100644 documentation/src/test/java/org/hibernate/userguide/associations/OneToOnePrimaryKeyJoinColumnTest.java delete mode 100644 documentation/src/test/java/org/hibernate/userguide/persister/PersisterTest.java diff --git a/documentation/src/main/asciidoc/userguide/chapters/domain/extras/id/CompositeIdAssociationPrimaryKeyJoinColumn.java b/documentation/src/main/asciidoc/userguide/chapters/domain/extras/id/CompositeIdAssociationPrimaryKeyJoinColumn.java deleted file mode 100644 index d432c81781..0000000000 --- a/documentation/src/main/asciidoc/userguide/chapters/domain/extras/id/CompositeIdAssociationPrimaryKeyJoinColumn.java +++ /dev/null @@ -1,29 +0,0 @@ -@Entity -public class PersonDetails { - - @Id - private Long id; - - private String nickName; - - @ManyToOne - @PrimaryKeyJoinColumn - private Person person; - - public String getNickName() { - return nickName; - } - - public void setNickName(String nickName) { - this.nickName = nickName; - } - - public Person getPerson() { - return person; - } - - public void setPerson(Person person) { - this.person = person; - this.id = person.getId(); - } -} \ No newline at end of file diff --git a/documentation/src/main/asciidoc/userguide/chapters/domain/extras/id/DerivedIdentifier.java b/documentation/src/main/asciidoc/userguide/chapters/domain/extras/id/DerivedIdentifier.java deleted file mode 100644 index 5eaac04d23..0000000000 --- a/documentation/src/main/asciidoc/userguide/chapters/domain/extras/id/DerivedIdentifier.java +++ /dev/null @@ -1,53 +0,0 @@ -@Entity -public class Person { - - @Id - @GeneratedValue - private Long id; - - @NaturalId - private String registrationNumber; - - public Person() {} - - public Person(String registrationNumber) { - this.registrationNumber = registrationNumber; - } - - public Long getId() { - return id; - } - - public String getRegistrationNumber() { - return registrationNumber; - } -} - -@Entity -public class PersonDetails { - - @Id - private Long id; - - private String nickName; - - @ManyToOne - @MapsId - private Person person; - - public String getNickName() { - return nickName; - } - - public void setNickName(String nickName) { - this.nickName = nickName; - } - - public Person getPerson() { - return person; - } - - public void setPerson(Person person) { - this.person = person; - } -} \ No newline at end of file diff --git a/documentation/src/main/asciidoc/userguide/chapters/domain/identifiers.adoc b/documentation/src/main/asciidoc/userguide/chapters/domain/identifiers.adoc index e2460c0a7a..cdb55ee4d7 100644 --- a/documentation/src/main/asciidoc/userguide/chapters/domain/identifiers.adoc +++ b/documentation/src/main/asciidoc/userguide/chapters/domain/identifiers.adoc @@ -1,6 +1,7 @@ [[identifiers]] === Identifiers :sourcedir: ../../../../../test/java/org/hibernate/userguide/mapping/identifier +:sourcedir-associations: ../../../../../test/java/org/hibernate/userguide/associations :extrasdir: extras Identifiers model the primary key of an entity. They are used to uniquely identify each specific entity. @@ -482,12 +483,22 @@ JPA 2.0 added support for derived identifiers which allow an entity to borrow th ==== [source,java] ---- -include::{extrasdir}/id/DerivedIdentifier.java[] +include::{sourcedir-associations}/OneToOneMapsIdTest.java[tag=identifiers-derived-mapsid, indent=0] ---- ==== In the example above, the `PersonDetails` entity uses the `id` column for both the entity identifier and for the many-to-one association to the `Person` entity. The value of the `PersonDetails` entity identifier is "derived" from the identifier of its parent `Person` entity. + +[[identifiers-derived-mapsid-persist-example]] +.Derived identifier with `@MapsId` persist example +==== +[source,java] +---- +include::{sourcedir-associations}/OneToOneMapsIdTest.java[tag=identifiers-derived-mapsid-persist-example, indent=0] +---- +==== + The `@MapsId` annotation can also reference columns from an `@EmbeddedId` identifier as well. The previous example can also be mapped using `@PrimaryKeyJoinColumn`. @@ -497,13 +508,14 @@ The previous example can also be mapped using `@PrimaryKeyJoinColumn`. ==== [source,java] ---- -include::{extrasdir}/id/CompositeIdAssociationPrimaryKeyJoinColumn.java[] +include::{sourcedir-associations}/OneToOnePrimaryKeyJoinColumnTest.java[tag=identifiers-derived-primarykeyjoincolumn, indent=0] ---- ==== [NOTE] ==== -Unlike `@MapsId`, the application developer is responsible for ensuring that the identifier and the many-to-one (or one-to-one) association are in sync. +Unlike `@MapsId`, the application developer is responsible for ensuring that the identifier and the many-to-one (or one-to-one) association are in sync +as you can see in the `PersonDetails#setPerson` method. ==== [[identifiers-rowid]] diff --git a/documentation/src/test/java/org/hibernate/userguide/associations/OneToOneMapsIdTest.java b/documentation/src/test/java/org/hibernate/userguide/associations/OneToOneMapsIdTest.java new file mode 100644 index 0000000000..8b7003a22a --- /dev/null +++ b/documentation/src/test/java/org/hibernate/userguide/associations/OneToOneMapsIdTest.java @@ -0,0 +1,126 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * License: GNU Lesser General Public License (LGPL), version 2.1 or later. + * See the lgpl.txt file in the root directory or . + */ +package org.hibernate.userguide.associations; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.ManyToOne; +import javax.persistence.MapsId; +import javax.persistence.OneToOne; + +import org.hibernate.annotations.NaturalId; +import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase; + +import org.junit.Test; + +import static org.hibernate.testing.transaction.TransactionUtil.doInJPA; +import static org.junit.Assert.assertEquals; + +/** + * @author Vlad Mihalcea + */ +public class OneToOneMapsIdTest extends BaseEntityManagerFunctionalTestCase { + + @Override + protected Class[] getAnnotatedClasses() { + return new Class[] { + Person.class, + PersonDetails.class + }; + } + + @Test + public void testLifecycle() { + //tag::identifiers-derived-mapsid-persist-example[] + doInJPA( this::entityManagerFactory, entityManager -> { + Person person = new Person( "ABC-123" ); + person.setId( 1L ); + entityManager.persist( person ); + + PersonDetails personDetails = new PersonDetails(); + personDetails.setNickName( "John Doe" ); + personDetails.setPerson( person ); + + entityManager.persist( personDetails ); + } ); + + doInJPA( this::entityManagerFactory, entityManager -> { + PersonDetails personDetails = entityManager.find( PersonDetails.class, 1L ); + + assertEquals("John Doe", personDetails.getNickName()); + } ); + //end::identifiers-derived-mapsid-persist-example[] + } + + //tag::identifiers-derived-mapsid[] + @Entity(name = "Person") + public static class Person { + + @Id + private Long id; + + @NaturalId + private String registrationNumber; + + public Person() {} + + public Person(String registrationNumber) { + this.registrationNumber = registrationNumber; + } + + //Getters and setters are omitted for brevity + //end::identifiers-derived-mapsid[] + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getRegistrationNumber() { + return registrationNumber; + } + //tag::identifiers-derived-mapsid[] + } + + @Entity(name = "PersonDetails") + public static class PersonDetails { + + @Id + private Long id; + + private String nickName; + + @OneToOne + @MapsId + private Person person; + + //Getters and setters are omitted for brevity + //end::identifiers-derived-mapsid[] + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public Person getPerson() { + return person; + } + + public void setPerson(Person person) { + this.person = person; + } + //tag::identifiers-derived-mapsid[] + } + //end::identifiers-derived-mapsid[] + +} diff --git a/documentation/src/test/java/org/hibernate/userguide/associations/OneToOnePrimaryKeyJoinColumnTest.java b/documentation/src/test/java/org/hibernate/userguide/associations/OneToOnePrimaryKeyJoinColumnTest.java new file mode 100644 index 0000000000..f28a1100b8 --- /dev/null +++ b/documentation/src/test/java/org/hibernate/userguide/associations/OneToOnePrimaryKeyJoinColumnTest.java @@ -0,0 +1,136 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * License: GNU Lesser General Public License (LGPL), version 2.1 or later. + * See the lgpl.txt file in the root directory or . + */ +package org.hibernate.userguide.associations; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.MapsId; +import javax.persistence.OneToOne; +import javax.persistence.PrimaryKeyJoinColumn; + +import org.hibernate.annotations.NaturalId; +import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase; + +import org.junit.Test; + +import static org.hibernate.testing.transaction.TransactionUtil.doInJPA; +import static org.junit.Assert.assertEquals; + +/** + * @author Vlad Mihalcea + */ +public class OneToOnePrimaryKeyJoinColumnTest extends BaseEntityManagerFunctionalTestCase { + + @Override + protected Class[] getAnnotatedClasses() { + return new Class[] { + Person.class, + PersonDetails.class + }; + } + + @Test + public void testLifecycle() { + //tag::identifiers-derived-primarykeyjoincolumn-persist-example[] + doInJPA( this::entityManagerFactory, entityManager -> { + Person person = new Person( "ABC-123" ); + person.setId( 1L ); + entityManager.persist( person ); + + PersonDetails personDetails = new PersonDetails(); + personDetails.setNickName( "John Doe" ); + personDetails.setPerson( person ); + + entityManager.persist( personDetails ); + } ); + + doInJPA( this::entityManagerFactory, entityManager -> { + PersonDetails personDetails = entityManager.find( PersonDetails.class, 1L ); + + assertEquals("John Doe", personDetails.getNickName()); + } ); + //end::identifiers-derived-primarykeyjoincolumn-persist-example[] + } + + //tag::identifiers-derived-primarykeyjoincolumn[] + @Entity(name = "Person") + public static class Person { + + @Id + private Long id; + + @NaturalId + private String registrationNumber; + + public Person() {} + + public Person(String registrationNumber) { + this.registrationNumber = registrationNumber; + } + + //Getters and setters are omitted for brevity + //end::identifiers-derived-primarykeyjoincolumn[] + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getRegistrationNumber() { + return registrationNumber; + } + //tag::identifiers-derived-primarykeyjoincolumn[] + } + + @Entity(name = "PersonDetails") + public static class PersonDetails { + + @Id + private Long id; + + private String nickName; + + @OneToOne + @PrimaryKeyJoinColumn + private Person person; + + public void setPerson(Person person) { + this.person = person; + this.id = person.getId(); + } + + //Other getters and setters are omitted for brevity + //end::identifiers-derived-primarykeyjoincolumn[] + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public Person getPerson() { + return person; + } + + //tag::identifiers-derived-primarykeyjoincolumn[] + } + //end::identifiers-derived-primarykeyjoincolumn[] + +} diff --git a/documentation/src/test/java/org/hibernate/userguide/persister/PersisterTest.java b/documentation/src/test/java/org/hibernate/userguide/persister/PersisterTest.java deleted file mode 100644 index fcb108833b..0000000000 --- a/documentation/src/test/java/org/hibernate/userguide/persister/PersisterTest.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Hibernate, Relational Persistence for Idiomatic Java - * - * License: GNU Lesser General Public License (LGPL), version 2.1 or later. - * See the lgpl.txt file in the root directory or . - */ -package org.hibernate.userguide.persister; - -import org.hibernate.mapping.Collection; -import org.hibernate.mapping.PersistentClass; -import org.hibernate.persister.entity.SingleTableEntityPersister; - -import org.hibernate.testing.junit4.BaseNonConfigCoreFunctionalTestCase; -import org.junit.Test; - -import static org.junit.Assert.assertEquals; - -/** - * @author Shawn Clowater - */ -public class PersisterTest extends BaseNonConfigCoreFunctionalTestCase { - @Test - public void testEntityEntityPersisterAndPersisterSpecified() throws Exception { - //checks to see that the persister specified with the @Persister annotation takes precedence if a @Entity.persister() is also specified - PersistentClass persistentClass = metadata().getEntityBinding( Author.class.getName() ); - assertEquals( "Incorrect Persister class for " + persistentClass.getMappedClass(), EntityPersister.class, - persistentClass.getEntityPersisterClass() ); - } - - @Test - public void testEntityEntityPersisterSpecified() throws Exception { - //tests the persister specified with an @Entity.persister() - PersistentClass persistentClass = metadata().getEntityBinding( Book.class.getName() ); - assertEquals( "Incorrect Persister class for " + persistentClass.getMappedClass(), - SingleTableEntityPersister.class, persistentClass.getEntityPersisterClass() ); - } - - @Test - public void testCollectionPersisterSpecified() throws Exception { - //tests the persister specified by the @Persister annotation on a collection - Collection collection = metadata().getCollectionBinding( Author.class.getName() + ".cards" ); - assertEquals( "Incorrect Persister class for collection " + collection.getRole(), CollectionPersister.class, - collection.getCollectionPersisterClass() ); - } - - @Override - protected Class[] getAnnotatedClasses() { - return new Class[]{ - Book.class, - Author.class - }; - } -}