Skip to content

Commit 5ea0d92

Browse files
beikovSanne
authored andcommitted
HHH-14329 test case showing that DirtinessTracker usage for enhanced entities doesn't respect mutable types
1 parent c444d5f commit 5ea0d92

File tree

3 files changed

+145
-0
lines changed

3 files changed

+145
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/*
2+
* Hibernate, Relational Persistence for Idiomatic Java
3+
*
4+
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
5+
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
6+
*/
7+
8+
package org.hibernate.test.bytecode.enhancement.mutable;
9+
10+
import java.util.HashMap;
11+
import java.util.Map;
12+
import java.util.stream.Collectors;
13+
import javax.persistence.AttributeConverter;
14+
15+
public class MapStringConverter implements AttributeConverter<Map<String, String>, String> {
16+
17+
@Override
18+
public String convertToDatabaseColumn(Map<String, String> attribute) {
19+
if ( attribute == null ) {
20+
return null;
21+
}
22+
return attribute.entrySet().stream()
23+
.map( entry -> entry.getKey() + ";" + entry.getValue() )
24+
.collect( Collectors.joining( ";" ) );
25+
}
26+
27+
@Override
28+
public Map<String, String> convertToEntityAttribute(String dbData) {
29+
if ( dbData == null ) {
30+
return null;
31+
}
32+
String[] strings = dbData.split( ";" );
33+
Map<String, String> map = new HashMap<>();
34+
for ( int i = 0; i < strings.length; i += 2 ) {
35+
map.put( strings[i], strings[i + 1] );
36+
}
37+
return map;
38+
}
39+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/*
2+
* Hibernate, Relational Persistence for Idiomatic Java
3+
*
4+
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
5+
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
6+
*/
7+
8+
package org.hibernate.test.bytecode.enhancement.mutable;
9+
10+
import java.util.Date;
11+
12+
import org.hibernate.testing.TestForIssue;
13+
import org.hibernate.testing.bytecode.enhancement.BytecodeEnhancerRunner;
14+
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
15+
import org.junit.Assert;
16+
import org.junit.Test;
17+
import org.junit.runner.RunWith;
18+
19+
@RunWith(BytecodeEnhancerRunner.class)
20+
public class MutableTypeEnhancementTestCase extends BaseCoreFunctionalTestCase {
21+
22+
@Override
23+
protected Class<?>[] getAnnotatedClasses() {
24+
return new Class[] { TestEntity.class };
25+
}
26+
27+
@Test
28+
@TestForIssue(jiraKey = "HHH-14329")
29+
public void testMutateMutableTypeObject() throws Exception {
30+
inTransaction( entityManager -> {
31+
TestEntity e = new TestEntity();
32+
e.setId( 1L );
33+
e.setDate( new Date() );
34+
e.getTexts().put( "a", "abc" );
35+
entityManager.persist( e );
36+
} );
37+
38+
inTransaction( entityManager -> {
39+
TestEntity e = entityManager.find( TestEntity.class, 1L );
40+
e.getDate().setTime( 0 );
41+
e.getTexts().put( "a", "def" );
42+
} );
43+
44+
inTransaction( entityManager -> {
45+
TestEntity e = entityManager.find( TestEntity.class, 1L );
46+
Assert.assertEquals( 0L, e.getDate().getTime() );
47+
Assert.assertEquals( "def", e.getTexts().get( "a" ) );
48+
} );
49+
}
50+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/*
2+
* Hibernate, Relational Persistence for Idiomatic Java
3+
*
4+
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
5+
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
6+
*/
7+
package org.hibernate.test.bytecode.enhancement.mutable;
8+
9+
import java.util.Date;
10+
import java.util.HashMap;
11+
import java.util.Map;
12+
import javax.persistence.Basic;
13+
import javax.persistence.Column;
14+
import javax.persistence.Convert;
15+
import javax.persistence.Entity;
16+
import javax.persistence.Id;
17+
import javax.persistence.Temporal;
18+
import javax.persistence.TemporalType;
19+
20+
@Entity
21+
public class TestEntity {
22+
@Id
23+
private Long id;
24+
25+
@Temporal(TemporalType.TIMESTAMP)
26+
private Date date;
27+
28+
@Basic
29+
@Column(name = "TEXTS")
30+
@Convert(converter = MapStringConverter.class)
31+
private Map<String, String> texts = new HashMap<>();
32+
33+
public Long getId() {
34+
return id;
35+
}
36+
37+
public void setId(Long id) {
38+
this.id = id;
39+
}
40+
41+
public Date getDate() {
42+
return date;
43+
}
44+
45+
public void setDate(Date date) {
46+
this.date = date;
47+
}
48+
49+
public Map<String, String> getTexts() {
50+
return texts;
51+
}
52+
53+
public void setTexts(Map<String, String> texts) {
54+
this.texts = texts;
55+
}
56+
}

0 commit comments

Comments
 (0)