BAEL-2901 Composite primary keys in JPA (#6994)
* BAEL-2901 Composite primary keys in JPA * Formatted code using the recommended formatter.xml
This commit is contained in:
parent
41eb61026b
commit
f4b38eed2a
@ -0,0 +1,43 @@
|
|||||||
|
package com.baeldung.jpa.entity;
|
||||||
|
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.IdClass;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@IdClass(AccountId.class)
|
||||||
|
public class Account {
|
||||||
|
|
||||||
|
@Id
|
||||||
|
private String accountNumber;
|
||||||
|
|
||||||
|
@Id
|
||||||
|
private String accountType;
|
||||||
|
|
||||||
|
private String description;
|
||||||
|
|
||||||
|
public String getAccountNumber() {
|
||||||
|
return accountNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAccountNumber(String accountNumber) {
|
||||||
|
this.accountNumber = accountNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAccountType() {
|
||||||
|
return accountType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAccountType(String accountType) {
|
||||||
|
this.accountType = accountType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDescription() {
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDescription(String description) {
|
||||||
|
this.description = description;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,52 @@
|
|||||||
|
package com.baeldung.jpa.entity;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
public class AccountId implements Serializable {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
private String accountNumber;
|
||||||
|
private String accountType;
|
||||||
|
|
||||||
|
public AccountId() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public AccountId(String accountNumber, String accountType) {
|
||||||
|
this.accountNumber = accountNumber;
|
||||||
|
this.accountType = accountType;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
final int prime = 31;
|
||||||
|
int result = 1;
|
||||||
|
result = prime * result + ((accountNumber == null) ? 0 : accountNumber.hashCode());
|
||||||
|
result = prime * result + ((accountType == null) ? 0 : accountType.hashCode());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (this == obj)
|
||||||
|
return true;
|
||||||
|
if (obj == null)
|
||||||
|
return false;
|
||||||
|
if (getClass() != obj.getClass())
|
||||||
|
return false;
|
||||||
|
AccountId other = (AccountId) obj;
|
||||||
|
if (accountNumber == null) {
|
||||||
|
if (other.accountNumber != null)
|
||||||
|
return false;
|
||||||
|
} else if (!accountNumber.equals(other.accountNumber))
|
||||||
|
return false;
|
||||||
|
if (accountType == null) {
|
||||||
|
if (other.accountType != null)
|
||||||
|
return false;
|
||||||
|
} else if (!accountType.equals(other.accountType))
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,34 @@
|
|||||||
|
package com.baeldung.jpa.entity;
|
||||||
|
|
||||||
|
import javax.persistence.EmbeddedId;
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
public class Book {
|
||||||
|
|
||||||
|
@EmbeddedId
|
||||||
|
private BookId bookId;
|
||||||
|
|
||||||
|
private String description;
|
||||||
|
|
||||||
|
public Book() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public Book(BookId bookId) {
|
||||||
|
this.bookId = bookId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BookId getBookId() {
|
||||||
|
return bookId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDescription() {
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDescription(String description) {
|
||||||
|
this.description = description;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,62 @@
|
|||||||
|
package com.baeldung.jpa.entity;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
import javax.persistence.Embeddable;
|
||||||
|
|
||||||
|
@Embeddable
|
||||||
|
public class BookId implements Serializable {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
private String title;
|
||||||
|
private String language;
|
||||||
|
|
||||||
|
public BookId() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public BookId(String title, String language) {
|
||||||
|
this.title = title;
|
||||||
|
this.language = language;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTitle() {
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLanguage() {
|
||||||
|
return language;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
final int prime = 31;
|
||||||
|
int result = 1;
|
||||||
|
result = prime * result + ((language == null) ? 0 : language.hashCode());
|
||||||
|
result = prime * result + ((title == null) ? 0 : title.hashCode());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (this == obj)
|
||||||
|
return true;
|
||||||
|
if (obj == null)
|
||||||
|
return false;
|
||||||
|
if (getClass() != obj.getClass())
|
||||||
|
return false;
|
||||||
|
BookId other = (BookId) obj;
|
||||||
|
if (language == null) {
|
||||||
|
if (other.language != null)
|
||||||
|
return false;
|
||||||
|
} else if (!language.equals(other.language))
|
||||||
|
return false;
|
||||||
|
if (title == null) {
|
||||||
|
if (other.title != null)
|
||||||
|
return false;
|
||||||
|
} else if (!title.equals(other.title))
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,183 +1,226 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
|
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
|
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
|
||||||
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd"
|
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd"
|
||||||
version="2.2">
|
version="2.2">
|
||||||
|
|
||||||
<persistence-unit name="java-jpa-scheduled-day">
|
<persistence-unit name="java-jpa-scheduled-day">
|
||||||
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
|
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
|
||||||
<class>com.baeldung.sqlresultsetmapping.ScheduledDay</class>
|
<class>com.baeldung.sqlresultsetmapping.ScheduledDay</class>
|
||||||
<class>com.baeldung.sqlresultsetmapping.Employee</class>
|
<class>com.baeldung.sqlresultsetmapping.Employee</class>
|
||||||
<exclude-unlisted-classes>true</exclude-unlisted-classes>
|
<exclude-unlisted-classes>true</exclude-unlisted-classes>
|
||||||
<properties>
|
<properties>
|
||||||
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
|
<property name="javax.persistence.jdbc.driver"
|
||||||
<property name="javax.persistence.jdbc.url"
|
value="org.h2.Driver" />
|
||||||
value="jdbc:h2:mem:test;INIT=RUNSCRIPT FROM 'classpath:database.sql'"/>
|
<property name="javax.persistence.jdbc.url"
|
||||||
<property name="javax.persistence.jdbc.user" value="sa"/>
|
value="jdbc:h2:mem:test;INIT=RUNSCRIPT FROM 'classpath:database.sql'" />
|
||||||
<property name="javax.persistence.jdbc.password" value=""/>
|
<property name="javax.persistence.jdbc.user" value="sa" />
|
||||||
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
|
<property name="javax.persistence.jdbc.password" value="" />
|
||||||
<!--<property name="hibernate.hbm2ddl.auto" value="create-drop" />-->
|
<property name="hibernate.dialect"
|
||||||
<property name="show_sql" value="true"/>
|
value="org.hibernate.dialect.H2Dialect" />
|
||||||
<property name="hibernate.temp.use_jdbc_metadata_defaults" value="false"/>
|
<!--<property name="hibernate.hbm2ddl.auto" value="create-drop" /> -->
|
||||||
</properties>
|
<property name="show_sql" value="true" />
|
||||||
</persistence-unit>
|
<property name="hibernate.temp.use_jdbc_metadata_defaults"
|
||||||
|
value="false" />
|
||||||
|
</properties>
|
||||||
|
</persistence-unit>
|
||||||
|
|
||||||
<persistence-unit name="jpa-h2">
|
<persistence-unit name="jpa-h2">
|
||||||
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
|
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
|
||||||
<class>com.baeldung.jpa.stringcast.Message</class>
|
<class>com.baeldung.jpa.stringcast.Message</class>
|
||||||
<class>com.baeldung.jpa.enums.Article</class>
|
<class>com.baeldung.jpa.enums.Article</class>
|
||||||
<class>com.baeldung.jpa.enums.CategoryConverter</class>
|
<class>com.baeldung.jpa.enums.CategoryConverter</class>
|
||||||
<exclude-unlisted-classes>true</exclude-unlisted-classes>
|
<exclude-unlisted-classes>true</exclude-unlisted-classes>
|
||||||
<properties>
|
<properties>
|
||||||
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
|
<property name="javax.persistence.jdbc.driver"
|
||||||
<property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:test"/>
|
value="org.h2.Driver" />
|
||||||
<property name="javax.persistence.jdbc.user" value="sa"/>
|
<property name="javax.persistence.jdbc.url"
|
||||||
<property name="javax.persistence.jdbc.password" value=""/>
|
value="jdbc:h2:mem:test" />
|
||||||
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
|
<property name="javax.persistence.jdbc.user" value="sa" />
|
||||||
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
|
<property name="javax.persistence.jdbc.password" value="" />
|
||||||
<property name="show_sql" value="true"/>
|
<property name="hibernate.dialect"
|
||||||
<property name="hibernate.temp.use_jdbc_metadata_defaults" value="false"/>
|
value="org.hibernate.dialect.H2Dialect" />
|
||||||
</properties>
|
<property name="hibernate.hbm2ddl.auto" value="create-drop" />
|
||||||
</persistence-unit>
|
<property name="show_sql" value="true" />
|
||||||
|
<property name="hibernate.temp.use_jdbc_metadata_defaults"
|
||||||
|
value="false" />
|
||||||
|
</properties>
|
||||||
|
</persistence-unit>
|
||||||
|
|
||||||
<persistence-unit name="jpa-db">
|
<persistence-unit name="jpa-db">
|
||||||
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
|
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
|
||||||
<class>com.baeldung.jpa.model.Car</class>
|
<class>com.baeldung.jpa.model.Car</class>
|
||||||
<exclude-unlisted-classes>true</exclude-unlisted-classes>
|
<exclude-unlisted-classes>true</exclude-unlisted-classes>
|
||||||
<properties>
|
<properties>
|
||||||
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
|
<property name="javax.persistence.jdbc.driver"
|
||||||
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://127.0.0.1:3306/baeldung"/>
|
value="com.mysql.jdbc.Driver" />
|
||||||
<property name="javax.persistence.jdbc.user" value="baeldung"/>
|
<property name="javax.persistence.jdbc.url"
|
||||||
<property name="javax.persistence.jdbc.password" value="YourPassword"/>
|
value="jdbc:mysql://127.0.0.1:3306/baeldung" />
|
||||||
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
|
<property name="javax.persistence.jdbc.user"
|
||||||
<property name="hibernate.show_sql" value="true"/>
|
value="baeldung" />
|
||||||
</properties>
|
<property name="javax.persistence.jdbc.password"
|
||||||
</persistence-unit>
|
value="YourPassword" />
|
||||||
|
<property name="hibernate.dialect"
|
||||||
|
value="org.hibernate.dialect.MySQLDialect" />
|
||||||
|
<property name="hibernate.show_sql" value="true" />
|
||||||
|
</properties>
|
||||||
|
</persistence-unit>
|
||||||
|
|
||||||
<persistence-unit name="entity-graph-pu" transaction-type="RESOURCE_LOCAL">
|
<persistence-unit name="entity-graph-pu"
|
||||||
<class>com.baeldung.jpa.entitygraph.model.Post</class>
|
transaction-type="RESOURCE_LOCAL">
|
||||||
<class>com.baeldung.jpa.entitygraph.model.User</class>
|
<class>com.baeldung.jpa.entitygraph.model.Post</class>
|
||||||
<class>com.baeldung.jpa.entitygraph.model.Comment</class>
|
<class>com.baeldung.jpa.entitygraph.model.User</class>
|
||||||
<exclude-unlisted-classes>true</exclude-unlisted-classes>
|
<class>com.baeldung.jpa.entitygraph.model.Comment</class>
|
||||||
<properties>
|
<exclude-unlisted-classes>true</exclude-unlisted-classes>
|
||||||
|
<properties>
|
||||||
|
|
||||||
<!--H2-->
|
<!--H2 -->
|
||||||
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
|
<property name="javax.persistence.jdbc.driver"
|
||||||
<property name="javax.persistence.jdbc.url"
|
value="org.h2.Driver" />
|
||||||
value="jdbc:h2:mem:entitygraphdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE"/>
|
<property name="javax.persistence.jdbc.url"
|
||||||
|
value="jdbc:h2:mem:entitygraphdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE" />
|
||||||
|
|
||||||
<property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
|
<property
|
||||||
<property name="javax.persistence.sql-load-script-source" value="data-init.sql"/>
|
name="javax.persistence.schema-generation.database.action"
|
||||||
</properties>
|
value="drop-and-create" />
|
||||||
</persistence-unit>
|
<property name="javax.persistence.sql-load-script-source"
|
||||||
|
value="data-init.sql" />
|
||||||
|
</properties>
|
||||||
|
</persistence-unit>
|
||||||
|
|
||||||
<persistence-unit name="java8-datetime-postgresql" transaction-type="RESOURCE_LOCAL">
|
<persistence-unit name="java8-datetime-postgresql"
|
||||||
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
|
transaction-type="RESOURCE_LOCAL">
|
||||||
<class>com.baeldung.jpa.datetime.JPA22DateTimeEntity</class>
|
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
|
||||||
<exclude-unlisted-classes>true</exclude-unlisted-classes>
|
<class>com.baeldung.jpa.datetime.JPA22DateTimeEntity</class>
|
||||||
<properties>
|
<exclude-unlisted-classes>true</exclude-unlisted-classes>
|
||||||
<property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>
|
<properties>
|
||||||
<property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5432/java8-datetime2"/>
|
<property name="javax.persistence.jdbc.driver"
|
||||||
<property name="javax.persistence.jdbc.user" value="postgres"/>
|
value="org.postgresql.Driver" />
|
||||||
<property name="javax.persistence.jdbc.password" value="postgres"/>
|
<property name="javax.persistence.jdbc.url"
|
||||||
<property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
|
value="jdbc:postgresql://localhost:5432/java8-datetime2" />
|
||||||
|
<property name="javax.persistence.jdbc.user"
|
||||||
|
value="postgres" />
|
||||||
|
<property name="javax.persistence.jdbc.password"
|
||||||
|
value="postgres" />
|
||||||
|
<property
|
||||||
|
name="javax.persistence.schema-generation.database.action"
|
||||||
|
value="drop-and-create" />
|
||||||
|
|
||||||
<!-- configure logging -->
|
<!-- configure logging -->
|
||||||
<property name="eclipselink.logging.level" value="INFO"/>
|
<property name="eclipselink.logging.level" value="INFO" />
|
||||||
<property name="eclipselink.logging.level.sql" value="FINE"/>
|
<property name="eclipselink.logging.level.sql" value="FINE" />
|
||||||
<property name="eclipselink.logging.parameters" value="true"/>
|
<property name="eclipselink.logging.parameters" value="true" />
|
||||||
</properties>
|
</properties>
|
||||||
</persistence-unit>
|
</persistence-unit>
|
||||||
|
|
||||||
<persistence-unit name="jpa-h2-criteria">
|
<persistence-unit name="jpa-h2-criteria">
|
||||||
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
|
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
|
||||||
<class>com.baeldung.jpa.criteria.entity.Item</class>
|
<class>com.baeldung.jpa.criteria.entity.Item</class>
|
||||||
<exclude-unlisted-classes>true</exclude-unlisted-classes>
|
<exclude-unlisted-classes>true</exclude-unlisted-classes>
|
||||||
<properties>
|
<properties>
|
||||||
<property name="javax.persistence.jdbc.driver"
|
<property name="javax.persistence.jdbc.driver"
|
||||||
value="org.h2.Driver" />
|
value="org.h2.Driver" />
|
||||||
<property name="javax.persistence.jdbc.url"
|
<property name="javax.persistence.jdbc.url"
|
||||||
value="jdbc:h2:mem:test" />
|
value="jdbc:h2:mem:test" />
|
||||||
<property name="javax.persistence.jdbc.user" value="sa" />
|
<property name="javax.persistence.jdbc.user" value="sa" />
|
||||||
<property name="javax.persistence.jdbc.password" value="" />
|
<property name="javax.persistence.jdbc.password" value="" />
|
||||||
<property name="hibernate.dialect"
|
<property name="hibernate.dialect"
|
||||||
value="org.hibernate.dialect.H2Dialect" />
|
value="org.hibernate.dialect.H2Dialect" />
|
||||||
<property name="hibernate.hbm2ddl.auto" value="create-drop" />
|
<property name="hibernate.hbm2ddl.auto" value="create-drop" />
|
||||||
<property name="show_sql" value="true" />
|
<property name="show_sql" value="true" />
|
||||||
<property name="hibernate.temp.use_jdbc_metadata_defaults"
|
<property name="hibernate.temp.use_jdbc_metadata_defaults"
|
||||||
value="false" />
|
value="false" />
|
||||||
<property name="javax.persistence.sql-load-script-source" value="item.sql"/>
|
<property name="javax.persistence.sql-load-script-source"
|
||||||
</properties>
|
value="item.sql" />
|
||||||
</persistence-unit>
|
</properties>
|
||||||
|
</persistence-unit>
|
||||||
|
|
||||||
<persistence-unit name="jpa-query-types">
|
<persistence-unit name="jpa-query-types">
|
||||||
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
|
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
|
||||||
<class>com.baeldung.jpa.querytypes.UserEntity</class>
|
<class>com.baeldung.jpa.querytypes.UserEntity</class>
|
||||||
<exclude-unlisted-classes>true</exclude-unlisted-classes>
|
<exclude-unlisted-classes>true</exclude-unlisted-classes>
|
||||||
<properties>
|
<properties>
|
||||||
<property name="javax.persistence.jdbc.driver"
|
<property name="javax.persistence.jdbc.driver"
|
||||||
value="org.h2.Driver" />
|
value="org.h2.Driver" />
|
||||||
<property name="javax.persistence.jdbc.url"
|
<property name="javax.persistence.jdbc.url"
|
||||||
value="jdbc:h2:mem:test" />
|
value="jdbc:h2:mem:test" />
|
||||||
<property name="javax.persistence.jdbc.user" value="sa" />
|
<property name="javax.persistence.jdbc.user" value="sa" />
|
||||||
<property name="javax.persistence.jdbc.password" value="" />
|
<property name="javax.persistence.jdbc.password" value="" />
|
||||||
<property name="hibernate.dialect"
|
<property name="hibernate.dialect"
|
||||||
value="org.hibernate.dialect.H2Dialect" />
|
value="org.hibernate.dialect.H2Dialect" />
|
||||||
<property name="hibernate.hbm2ddl.auto" value="create-drop" />
|
<property name="hibernate.hbm2ddl.auto" value="create-drop" />
|
||||||
<property name="show_sql" value="true" />
|
<property name="show_sql" value="true" />
|
||||||
<property name="hibernate.temp.use_jdbc_metadata_defaults"
|
<property name="hibernate.temp.use_jdbc_metadata_defaults"
|
||||||
value="false" />
|
value="false" />
|
||||||
<property name="javax.persistence.sql-load-script-source" value="users.sql"/>
|
<property name="javax.persistence.sql-load-script-source"
|
||||||
</properties>
|
value="users.sql" />
|
||||||
</persistence-unit>
|
</properties>
|
||||||
|
</persistence-unit>
|
||||||
|
|
||||||
<persistence-unit name="entity-default-values">
|
<persistence-unit name="entity-default-values">
|
||||||
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
|
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
|
||||||
<class>com.baeldung.jpa.defaultvalues.User</class>
|
<class>com.baeldung.jpa.defaultvalues.User</class>
|
||||||
<exclude-unlisted-classes>true</exclude-unlisted-classes>
|
<exclude-unlisted-classes>true</exclude-unlisted-classes>
|
||||||
<properties>
|
<properties>
|
||||||
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver" />
|
<property name="javax.persistence.jdbc.driver"
|
||||||
<property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:test" />
|
value="org.h2.Driver" />
|
||||||
<property name="javax.persistence.jdbc.user" value="sa" />
|
<property name="javax.persistence.jdbc.url"
|
||||||
<property name="javax.persistence.jdbc.password" value="" />
|
value="jdbc:h2:mem:test" />
|
||||||
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />
|
<property name="javax.persistence.jdbc.user" value="sa" />
|
||||||
<property name="hibernate.hbm2ddl.auto" value="create-drop" />
|
<property name="javax.persistence.jdbc.password" value="" />
|
||||||
<property name="show_sql" value="true" />
|
<property name="hibernate.dialect"
|
||||||
<property name="hibernate.temp.use_jdbc_metadata_defaults" value="false" />
|
value="org.hibernate.dialect.H2Dialect" />
|
||||||
</properties>
|
<property name="hibernate.hbm2ddl.auto" value="create-drop" />
|
||||||
</persistence-unit>
|
<property name="show_sql" value="true" />
|
||||||
|
<property name="hibernate.temp.use_jdbc_metadata_defaults"
|
||||||
|
value="false" />
|
||||||
|
</properties>
|
||||||
|
</persistence-unit>
|
||||||
|
|
||||||
<persistence-unit name="jpa-entity-definition">
|
<persistence-unit name="jpa-entity-definition">
|
||||||
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
|
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
|
||||||
<class>com.baeldung.jpa.entity.Student</class>
|
<class>com.baeldung.jpa.entity.Student</class>
|
||||||
<exclude-unlisted-classes>true</exclude-unlisted-classes>
|
<class>com.baeldung.jpa.entity.Book</class>
|
||||||
<properties>
|
<class>com.baeldung.jpa.entity.BookId</class>
|
||||||
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver" />
|
<class>com.baeldung.jpa.entity.Account</class>
|
||||||
<property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:test" />
|
<class>com.baeldung.jpa.entity.AccountId</class>
|
||||||
<property name="javax.persistence.jdbc.user" value="sa" />
|
<exclude-unlisted-classes>true</exclude-unlisted-classes>
|
||||||
<property name="javax.persistence.jdbc.password" value="" />
|
<properties>
|
||||||
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />
|
<property name="javax.persistence.jdbc.driver"
|
||||||
<property name="hibernate.hbm2ddl.auto" value="create-drop" />
|
value="org.h2.Driver" />
|
||||||
<property name="show_sql" value="true" />
|
<property name="javax.persistence.jdbc.url"
|
||||||
<property name="hibernate.temp.use_jdbc_metadata_defaults" value="false" />
|
value="jdbc:h2:mem:test" />
|
||||||
</properties>
|
<property name="javax.persistence.jdbc.user" value="sa" />
|
||||||
</persistence-unit>
|
<property name="javax.persistence.jdbc.password" value="" />
|
||||||
|
<property name="hibernate.dialect"
|
||||||
|
value="org.hibernate.dialect.H2Dialect" />
|
||||||
|
<property name="hibernate.hbm2ddl.auto" value="create-drop" />
|
||||||
|
<property name="show_sql" value="true" />
|
||||||
|
<property name="hibernate.temp.use_jdbc_metadata_defaults"
|
||||||
|
value="false" />
|
||||||
|
</properties>
|
||||||
|
</persistence-unit>
|
||||||
|
|
||||||
<persistence-unit name="jpa-projections">
|
<persistence-unit name="jpa-projections">
|
||||||
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
|
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
|
||||||
<class>com.baeldung.jpa.projections.Product</class>
|
<class>com.baeldung.jpa.projections.Product</class>
|
||||||
<exclude-unlisted-classes>true</exclude-unlisted-classes>
|
<exclude-unlisted-classes>true</exclude-unlisted-classes>
|
||||||
<properties>
|
<properties>
|
||||||
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
|
<property name="javax.persistence.jdbc.driver"
|
||||||
<property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:test"/>
|
value="org.h2.Driver" />
|
||||||
<property name="javax.persistence.jdbc.user" value="sa"/>
|
<property name="javax.persistence.jdbc.url"
|
||||||
<property name="javax.persistence.jdbc.password" value=""/>
|
value="jdbc:h2:mem:test" />
|
||||||
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
|
<property name="javax.persistence.jdbc.user" value="sa" />
|
||||||
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
|
<property name="javax.persistence.jdbc.password" value="" />
|
||||||
<property name="show_sql" value="true"/>
|
<property name="hibernate.dialect"
|
||||||
<property name="hibernate.temp.use_jdbc_metadata_defaults" value="false"/>
|
value="org.hibernate.dialect.H2Dialect" />
|
||||||
<property name="javax.persistence.sql-load-script-source" value="products_jpa.sql"/>
|
<property name="hibernate.hbm2ddl.auto" value="create-drop" />
|
||||||
</properties>
|
<property name="show_sql" value="true" />
|
||||||
</persistence-unit>
|
<property name="hibernate.temp.use_jdbc_metadata_defaults"
|
||||||
|
value="false" />
|
||||||
|
<property name="javax.persistence.sql-load-script-source"
|
||||||
|
value="products_jpa.sql" />
|
||||||
|
</properties>
|
||||||
|
</persistence-unit>
|
||||||
</persistence>
|
</persistence>
|
@ -0,0 +1,114 @@
|
|||||||
|
package com.baeldung.jpa.entity;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertNotNull;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
|
import javax.persistence.EntityManager;
|
||||||
|
import javax.persistence.EntityManagerFactory;
|
||||||
|
import javax.persistence.Persistence;
|
||||||
|
|
||||||
|
import org.junit.AfterClass;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class CompositeKeysIntegrationTest {
|
||||||
|
|
||||||
|
private static final String SAVINGS_ACCOUNT = "Savings";
|
||||||
|
private static final String ACCOUNT_NUMBER = "JXSDF324234";
|
||||||
|
private static final String ENGLISH = "English";
|
||||||
|
private static final String WAR_AND_PEACE = "War and Peace";
|
||||||
|
|
||||||
|
private static EntityManagerFactory emf;
|
||||||
|
private static EntityManager em;
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void setup() {
|
||||||
|
emf = Persistence.createEntityManagerFactory("jpa-entity-definition");
|
||||||
|
em = emf.createEntityManager();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void persistBookWithCompositeKeyThenRetrieveDetails() {
|
||||||
|
Book warAndPeace = createBook();
|
||||||
|
persist(warAndPeace);
|
||||||
|
clearThePersistenceContext();
|
||||||
|
Book book = findBookByBookId();
|
||||||
|
verifyAssertionsWith(book);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void persistAccountWithCompositeKeyThenRetrieveDetails() {
|
||||||
|
Account savingsAccount = createAccount();
|
||||||
|
persist(savingsAccount);
|
||||||
|
clearThePersistenceContext();
|
||||||
|
Account account = findAccountByAccountId();
|
||||||
|
verifyAssertionsWith(account);
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterClass
|
||||||
|
public static void destroy() {
|
||||||
|
if (em != null) {
|
||||||
|
em.close();
|
||||||
|
}
|
||||||
|
if (emf != null) {
|
||||||
|
emf.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Account createAccount() {
|
||||||
|
Account savingsAccount = new Account();
|
||||||
|
savingsAccount.setAccountNumber(ACCOUNT_NUMBER);
|
||||||
|
savingsAccount.setAccountType(SAVINGS_ACCOUNT);
|
||||||
|
savingsAccount.setDescription("Savings account");
|
||||||
|
return savingsAccount;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void verifyAssertionsWith(Account account) {
|
||||||
|
assertEquals(ACCOUNT_NUMBER, account.getAccountNumber());
|
||||||
|
assertEquals(SAVINGS_ACCOUNT, account.getAccountType());
|
||||||
|
}
|
||||||
|
|
||||||
|
private Account findAccountByAccountId() {
|
||||||
|
return em.find(Account.class, new AccountId(ACCOUNT_NUMBER, SAVINGS_ACCOUNT));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void persist(Account account) {
|
||||||
|
em.getTransaction()
|
||||||
|
.begin();
|
||||||
|
em.persist(account);
|
||||||
|
em.getTransaction()
|
||||||
|
.commit();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Book findBookByBookId() {
|
||||||
|
return em.find(Book.class, new BookId(WAR_AND_PEACE, ENGLISH));
|
||||||
|
}
|
||||||
|
|
||||||
|
private Book createBook() {
|
||||||
|
BookId bookId = new BookId(WAR_AND_PEACE, ENGLISH);
|
||||||
|
Book warAndPeace = new Book(bookId);
|
||||||
|
warAndPeace.setDescription("Novel and Historical Fiction");
|
||||||
|
return warAndPeace;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void verifyAssertionsWith(Book book) {
|
||||||
|
assertNotNull(book);
|
||||||
|
assertNotNull(book.getBookId());
|
||||||
|
assertEquals(WAR_AND_PEACE, book.getBookId()
|
||||||
|
.getTitle());
|
||||||
|
assertEquals(ENGLISH, book.getBookId()
|
||||||
|
.getLanguage());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void persist(Book book) {
|
||||||
|
em.getTransaction()
|
||||||
|
.begin();
|
||||||
|
em.persist(book);
|
||||||
|
em.getTransaction()
|
||||||
|
.commit();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void clearThePersistenceContext() {
|
||||||
|
em.clear();
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user