HHH-12150 - @MapKeyColumn referring to otherwise non-mapped column

This commit is contained in:
Steve Ebersole 2017-12-06 03:17:23 -06:00
parent 42c8c8f2e3
commit 42b8e77801
1 changed files with 151 additions and 0 deletions

View File

@ -0,0 +1,151 @@
/*
* 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.test.jpa.compliance.tck2_2;
import java.util.HashMap;
import java.util.Map;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.MapKeyColumn;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import org.hibernate.boot.MetadataSources;
import org.hibernate.testing.junit4.BaseNonConfigCoreFunctionalTestCase;
import org.junit.Test;
/**
* @author Steve Ebersole
*/
public class MapKeyColumnTest extends BaseNonConfigCoreFunctionalTestCase {
@Test
public void testReferenceToAlreadyMappedColumn() {
inTransaction(
session -> {
AddressCapable2 holder = new AddressCapable2( 1, "osd");
holder.addresses.put( "work", new Address2( 1, "123 Main St" ) );
session.persist( holder );
}
);
inTransaction(
session -> {
session.remove(
session.byId( AddressCapable2.class ).load( 1 )
);
}
);
}
@Test
public void testReferenceToNonMappedColumn() {
inTransaction(
session -> {
AddressCapable holder = new AddressCapable( 1, "osd");
holder.addresses.put( "work", new Address( 1, "123 Main St" ) );
session.persist( holder );
}
);
inTransaction(
session -> {
session.remove(
session.byId( AddressCapable.class ).load( 1 )
);
}
);
}
@Override
protected void applyMetadataSources(MetadataSources sources) {
super.applyMetadataSources( sources );
sources.addAnnotatedClass( AddressCapable.class );
sources.addAnnotatedClass( AddressCapable2.class );
sources.addAnnotatedClass( Address.class );
sources.addAnnotatedClass( Address2.class );
}
@Entity( name = "AddressCapable" )
@Table( name = "address_capables" )
public static class AddressCapable {
@Id
public Integer id;
public String name;
@JoinColumn
@MapKeyColumn( name = "a_type" )
@OneToMany( cascade = {CascadeType.PERSIST, CascadeType.REMOVE} )
public Map<String,Address> addresses = new HashMap<>();
public AddressCapable() {
}
public AddressCapable(Integer id, String name) {
this.id = id;
this.name = name;
}
}
@Entity( name = "Address" )
@Table( name = "addresses" )
public static class Address {
@Id
public Integer id;
public String street;
public Address() {
}
public Address(Integer id, String street) {
this.id = id;
this.street = street;
}
}
@Entity( name = "AddressCapable2" )
@Table( name = "address_capables2" )
public static class AddressCapable2 {
@Id
public Integer id;
public String name;
@JoinColumn
@MapKeyColumn( name = "a_type" )
@OneToMany( cascade = {CascadeType.PERSIST, CascadeType.REMOVE} )
public Map<String,Address2> addresses = new HashMap<>();
public AddressCapable2() {
}
public AddressCapable2(Integer id, String name) {
this.id = id;
this.name = name;
}
}
@Entity( name = "Address2" )
@Table( name = "addresses2" )
public static class Address2 {
@Id
public Integer id;
public String street;
@Column( name = "a_type" )
public String type;
public Address2() {
}
public Address2(Integer id, String street) {
this.id = id;
this.street = street;
}
}
}