-
Notifications
You must be signed in to change notification settings - Fork 3.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
HHH-10966 - Document @DiscriminatorValue NULL and NOT_NULL options
- Loading branch information
1 parent
3e5947e
commit 1b83be8
Showing
4 changed files
with
473 additions
and
8 deletions.
There are no files selected for viewing
21 changes: 21 additions & 0 deletions
21
...xtras/inheritance/entity-inheritance-single-table-discriminator-value-persist-example.sql
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
INSERT INTO Account (balance, interestRate, owner, overdraftFee, DTYPE, id) | ||
VALUES (100, 1.5, 'John Doe', 25, 'Debit', 1) | ||
|
||
INSERT INTO Account (balance, interestRate, owner, overdraftFee, DTYPE, id) | ||
VALUES (1000, 1.9, 'John Doe', 5000, 'Credit', 2) | ||
|
||
INSERT INTO Account (balance, interestRate, owner, id) | ||
VALUES (1000, 1.9, 'John Doe', 3) | ||
|
||
INSERT INTO Account (DTYPE, active, balance, interestRate, owner, id) | ||
VALUES ('Other', true, 25, 0.5, 'Vlad', 4) | ||
|
||
SELECT a.id as id2_0_, | ||
a.balance as balance3_0_, | ||
a.interestRate as interest4_0_, | ||
a.owner as owner5_0_, | ||
a.overdraftFee as overdraf6_0_, | ||
a.creditLimit as creditLi7_0_, | ||
a.active as active8_0_, | ||
a.DTYPE as DTYPE1_0_ | ||
FROM Account a |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
201 changes: 201 additions & 0 deletions
201
...rc/test/java/org/hibernate/userguide/inheritance/DiscriminatorNotNullSingleTableTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,201 @@ | ||
/* | ||
* 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 <http://www.gnu.org/licenses/lgpl-2.1.html>. | ||
*/ | ||
package org.hibernate.userguide.inheritance; | ||
|
||
import java.math.BigDecimal; | ||
import java.sql.Statement; | ||
import java.util.Map; | ||
import java.util.function.Function; | ||
import java.util.stream.Collectors; | ||
import javax.persistence.DiscriminatorValue; | ||
import javax.persistence.Entity; | ||
import javax.persistence.Id; | ||
import javax.persistence.Inheritance; | ||
import javax.persistence.InheritanceType; | ||
|
||
import org.hibernate.Session; | ||
import org.hibernate.dialect.H2Dialect; | ||
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase; | ||
|
||
import org.hibernate.testing.RequiresDialect; | ||
import org.junit.Test; | ||
|
||
import static org.hibernate.userguide.util.TransactionUtil.doInJPA; | ||
import static org.junit.Assert.assertEquals; | ||
|
||
/** | ||
* @author Vlad Mihalcea | ||
*/ | ||
@RequiresDialect( H2Dialect.class ) | ||
public class DiscriminatorNotNullSingleTableTest extends BaseEntityManagerFunctionalTestCase { | ||
|
||
@Override | ||
protected Class<?>[] getAnnotatedClasses() { | ||
return new Class<?>[] { | ||
DebitAccount.class, | ||
CreditAccount.class, | ||
OtherAccount.class | ||
}; | ||
} | ||
|
||
@Test | ||
public void test() { | ||
doInJPA( this::entityManagerFactory, entityManager -> { | ||
entityManager.unwrap( Session.class ).doWork( connection -> { | ||
try(Statement statement = connection.createStatement()) { | ||
statement.executeUpdate( "ALTER TABLE Account ALTER COLUMN DTYPE SET NULL" ); | ||
} | ||
} ); | ||
|
||
//tag::entity-inheritance-single-table-discriminator-value-persist-example[] | ||
DebitAccount debitAccount = new DebitAccount(); | ||
debitAccount.setId( 1L ); | ||
debitAccount.setOwner( "John Doe" ); | ||
debitAccount.setBalance( BigDecimal.valueOf( 100 ) ); | ||
debitAccount.setInterestRate( BigDecimal.valueOf( 1.5d ) ); | ||
debitAccount.setOverdraftFee( BigDecimal.valueOf( 25 ) ); | ||
|
||
CreditAccount creditAccount = new CreditAccount(); | ||
creditAccount.setId( 2L ); | ||
creditAccount.setOwner( "John Doe" ); | ||
creditAccount.setBalance( BigDecimal.valueOf( 1000 ) ); | ||
creditAccount.setInterestRate( BigDecimal.valueOf( 1.9d ) ); | ||
creditAccount.setCreditLimit( BigDecimal.valueOf( 5000 ) ); | ||
|
||
Account account = new Account(); | ||
account.setId( 3L ); | ||
account.setOwner( "John Doe" ); | ||
account.setBalance( BigDecimal.valueOf( 1000 ) ); | ||
account.setInterestRate( BigDecimal.valueOf( 1.9d ) ); | ||
|
||
entityManager.persist( debitAccount ); | ||
entityManager.persist( creditAccount ); | ||
entityManager.persist( account ); | ||
|
||
entityManager.unwrap( Session.class ).doWork( connection -> { | ||
try(Statement statement = connection.createStatement()) { | ||
statement.executeUpdate( | ||
"insert into Account (DTYPE, active, balance, interestRate, owner, id) " + | ||
"values ('Other', true, 25, 0.5, 'Vlad', 4)" | ||
); | ||
} | ||
} ); | ||
//end::entity-inheritance-single-table-discriminator-value-persist-example[] | ||
} ); | ||
|
||
doInJPA( this::entityManagerFactory, entityManager -> { | ||
//tag::entity-inheritance-single-table-discriminator-value-persist-example[] | ||
|
||
Map<Long, Account> accounts = entityManager.createQuery( | ||
"select a from Account a", Account.class ) | ||
.getResultList() | ||
.stream() | ||
.collect( Collectors.toMap( Account::getId, Function.identity())); | ||
|
||
assertEquals(4, accounts.size()); | ||
assertEquals( DebitAccount.class, accounts.get( 1L ).getClass() ); | ||
assertEquals( CreditAccount.class, accounts.get( 2L ).getClass() ); | ||
assertEquals( Account.class, accounts.get( 3L ).getClass() ); | ||
assertEquals( OtherAccount.class, accounts.get( 4L ).getClass() ); | ||
//end::entity-inheritance-single-table-discriminator-value-persist-example[] | ||
} ); | ||
} | ||
|
||
//tag::entity-inheritance-single-table-discriminator-value-example[] | ||
@Entity(name = "Account") | ||
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) | ||
@DiscriminatorValue( "null" ) | ||
public static class Account { | ||
|
||
@Id | ||
private Long id; | ||
|
||
private String owner; | ||
|
||
private BigDecimal balance; | ||
|
||
private BigDecimal interestRate; | ||
|
||
public Long getId() { | ||
return id; | ||
} | ||
|
||
public void setId(Long id) { | ||
this.id = id; | ||
} | ||
|
||
public String getOwner() { | ||
return owner; | ||
} | ||
|
||
public void setOwner(String owner) { | ||
this.owner = owner; | ||
} | ||
|
||
public BigDecimal getBalance() { | ||
return balance; | ||
} | ||
|
||
public void setBalance(BigDecimal balance) { | ||
this.balance = balance; | ||
} | ||
|
||
public BigDecimal getInterestRate() { | ||
return interestRate; | ||
} | ||
|
||
public void setInterestRate(BigDecimal interestRate) { | ||
this.interestRate = interestRate; | ||
} | ||
} | ||
|
||
@Entity(name = "DebitAccount") | ||
@DiscriminatorValue( "Debit" ) | ||
public static class DebitAccount extends Account { | ||
|
||
private BigDecimal overdraftFee; | ||
|
||
public BigDecimal getOverdraftFee() { | ||
return overdraftFee; | ||
} | ||
|
||
public void setOverdraftFee(BigDecimal overdraftFee) { | ||
this.overdraftFee = overdraftFee; | ||
} | ||
} | ||
|
||
@Entity(name = "CreditAccount") | ||
@DiscriminatorValue( "Credit" ) | ||
public static class CreditAccount extends Account { | ||
|
||
private BigDecimal creditLimit; | ||
|
||
public BigDecimal getCreditLimit() { | ||
return creditLimit; | ||
} | ||
|
||
public void setCreditLimit(BigDecimal creditLimit) { | ||
this.creditLimit = creditLimit; | ||
} | ||
} | ||
|
||
@Entity(name = "OtherAccount") | ||
@DiscriminatorValue( "not null" ) | ||
public static class OtherAccount extends Account { | ||
|
||
private boolean active; | ||
|
||
public boolean isActive() { | ||
return active; | ||
} | ||
|
||
public void setActive(boolean active) { | ||
this.active = active; | ||
} | ||
} | ||
//end::entity-inheritance-single-table-discriminator-value-example[] | ||
} |
Oops, something went wrong.