Skip to content

Commit

Permalink
Fix npe if money is null
Browse files Browse the repository at this point in the history
  • Loading branch information
ugrave committed Aug 3, 2022
1 parent 697c7a6 commit 73c5f29
Show file tree
Hide file tree
Showing 8 changed files with 224 additions and 8 deletions.
Expand Up @@ -75,14 +75,14 @@ public int hashCode(Object x) throws HibernateException {

@Override
public Object nullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor session, Object owner) throws HibernateException, SQLException {
if (rs.wasNull()) {
return null;
}

String amountColumnName = names[0];
String currencyColumnName = names[1];

BigDecimal amount = rs.getBigDecimal(amountColumnName);
if(amount == null) {
return null;
}

String currency = rs.getString(currencyColumnName);

return Money.of(amount, currency);
Expand Down
Expand Up @@ -12,6 +12,7 @@
import java.math.BigDecimal;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;

/**
* @author Piotr Olaszewski
Expand Down Expand Up @@ -64,6 +65,31 @@ public void testSearchByMoney() {
});
}

@Test
public void testReturnNullMoney() {
long _id = doInJPA(entityManager -> {
Salary salary = new Salary();
entityManager.persist(salary);
return salary.getId();
});

doInJPA(entityManager -> {
Salary salary = entityManager.createQuery("select s from Salary s where s.id = :id", Salary.class)
.setParameter("id", _id)
.getSingleResult();

assertNull(salary.getSalary());
});

doInJPA(entityManager -> {
MonetaryAmount money = entityManager.createQuery("select s.salary from Salary s where s.id = :id", MonetaryAmount.class)
.setParameter("id", _id)
.getSingleResult();

assertNull(money);
});
}

@Entity(name = "Salary")
@Table(name = "salary")
@TypeDef(name = "monetary-amount-currency", typeClass = MonetaryAmountType.class, defaultForType = MonetaryAmount.class)
Expand All @@ -72,6 +98,8 @@ public static class Salary {
@GeneratedValue
private Long id;

private String other;

@Columns(columns = {
@Column(name = "salary_amount"),
@Column(name = "salary_currency")
Expand All @@ -94,5 +122,13 @@ public MonetaryAmount getSalary() {
public void setSalary(MonetaryAmount salary) {
this.salary = salary;
}

public String getOther() {
return other;
}

public void setOther(String other) {
this.other = other;
}
}
}
Expand Up @@ -12,6 +12,7 @@
import java.math.BigDecimal;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;

/**
* @author Piotr Olaszewski
Expand Down Expand Up @@ -64,6 +65,31 @@ public void testSearchByMoney() {
});
}

@Test
public void testReturnNullMoney() {
long _id = doInJPA(entityManager -> {
Salary salary = new Salary();
entityManager.persist(salary);
return salary.getId();
});

doInJPA(entityManager -> {
Salary salary = entityManager.createQuery("select s from Salary s where s.id = :id", Salary.class)
.setParameter("id", _id)
.getSingleResult();

assertNull(salary.getSalary());
});

doInJPA(entityManager -> {
MonetaryAmount money = entityManager.createQuery("select s.salary from Salary s where s.id = :id", MonetaryAmount.class)
.setParameter("id", _id)
.getSingleResult();

assertNull(money);
});
}

@Entity(name = "Salary")
@Table(name = "salary")
@TypeDef(name = "monetary-amount-currency", typeClass = MonetaryAmountType.class, defaultForType = MonetaryAmount.class)
Expand All @@ -72,6 +98,8 @@ public static class Salary {
@GeneratedValue
private Long id;

private String other;

@Columns(columns = {
@Column(name = "salary_amount"),
@Column(name = "salary_currency")
Expand All @@ -94,5 +122,13 @@ public MonetaryAmount getSalary() {
public void setSalary(MonetaryAmount salary) {
this.salary = salary;
}

public String getOther() {
return other;
}

public void setOther(String other) {
this.other = other;
}
}
}
Expand Up @@ -75,14 +75,14 @@ public int hashCode(Object x) throws HibernateException {

@Override
public Object nullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor session, Object owner) throws HibernateException, SQLException {
if (rs.wasNull()) {
return null;
}

String amountColumnName = names[0];
String currencyColumnName = names[1];

BigDecimal amount = rs.getBigDecimal(amountColumnName);
if(amount == null) {
return null;
}

String currency = rs.getString(currencyColumnName);

return Money.of(amount, currency);
Expand Down
Expand Up @@ -12,6 +12,7 @@
import java.math.BigDecimal;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;

/**
* @author Piotr Olaszewski
Expand Down Expand Up @@ -64,6 +65,31 @@ public void testSearchByMoney() {
});
}

@Test
public void testReturnNullMoney() {
long _id = doInJPA(entityManager -> {
Salary salary = new Salary();
entityManager.persist(salary);
return salary.getId();
});

doInJPA(entityManager -> {
Salary salary = entityManager.createQuery("select s from Salary s where s.id = :id", Salary.class)
.setParameter("id", _id)
.getSingleResult();

assertNull(salary.getSalary());
});

doInJPA(entityManager -> {
MonetaryAmount money = entityManager.createQuery("select s.salary from Salary s where s.id = :id", MonetaryAmount.class)
.setParameter("id", _id)
.getSingleResult();

assertNull(money);
});
}

@Entity(name = "Salary")
@Table(name = "salary")
@TypeDef(name = "monetary-amount-currency", typeClass = MonetaryAmountType.class, defaultForType = MonetaryAmount.class)
Expand All @@ -72,6 +98,8 @@ public static class Salary {
@GeneratedValue
private Long id;

private String other;

@Columns(columns = {
@Column(name = "salary_amount"),
@Column(name = "salary_currency")
Expand All @@ -94,5 +122,13 @@ public MonetaryAmount getSalary() {
public void setSalary(MonetaryAmount salary) {
this.salary = salary;
}

public String getOther() {
return other;
}

public void setOther(String other) {
this.other = other;
}
}
}
Expand Up @@ -12,6 +12,7 @@
import java.math.BigDecimal;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;

/**
* @author Piotr Olaszewski
Expand Down Expand Up @@ -64,6 +65,31 @@ public void testSearchByMoney() {
});
}

@Test
public void testReturnNullMoney() {
long _id = doInJPA(entityManager -> {
Salary salary = new Salary();
entityManager.persist(salary);
return salary.getId();
});

doInJPA(entityManager -> {
Salary salary = entityManager.createQuery("select s from Salary s where s.id = :id", Salary.class)
.setParameter("id", _id)
.getSingleResult();

assertNull(salary.getSalary());
});

doInJPA(entityManager -> {
MonetaryAmount money = entityManager.createQuery("select s.salary from Salary s where s.id = :id", MonetaryAmount.class)
.setParameter("id", _id)
.getSingleResult();

assertNull(money);
});
}

@Entity(name = "Salary")
@Table(name = "salary")
@TypeDef(name = "monetary-amount-currency", typeClass = MonetaryAmountType.class, defaultForType = MonetaryAmount.class)
Expand All @@ -72,6 +98,8 @@ public static class Salary {
@GeneratedValue
private Long id;

private String other;

@Columns(columns = {
@Column(name = "salary_amount"),
@Column(name = "salary_currency")
Expand All @@ -94,5 +122,13 @@ public MonetaryAmount getSalary() {
public void setSalary(MonetaryAmount salary) {
this.salary = salary;
}

public String getOther() {
return other;
}

public void setOther(String other) {
this.other = other;
}
}
}
Expand Up @@ -10,6 +10,7 @@
import java.math.BigDecimal;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;

/**
* @author Piotr Olaszewski
Expand Down Expand Up @@ -62,13 +63,40 @@ public void testSearchByMoney() {
});
}

@Test
public void testReturnNullMoney() {
long _id = doInJPA(entityManager -> {
Salary salary = new Salary();
entityManager.persist(salary);
return salary.getId();
});

doInJPA(entityManager -> {
Salary salary = entityManager.createQuery("select s from Salary s where s.id = :id", Salary.class)
.setParameter("id", _id)
.getSingleResult();

assertNull(salary.getSalary());
});

doInJPA(entityManager -> {
MonetaryAmount money = entityManager.createQuery("select s.salary from Salary s where s.id = :id", MonetaryAmount.class)
.setParameter("id", _id)
.getSingleResult();

assertNull(money);
});
}

@Entity(name = "Salary")
@Table(name = "salary")
public static class Salary {
@Id
@GeneratedValue
private Long id;

private String other;

@AttributeOverride(name = "amount", column = @Column(name = "salary_amount"))
@AttributeOverride(name = "currency", column = @Column(name = "salary_currency"))
@CompositeType(MonetaryAmountType.class)
Expand All @@ -89,5 +117,13 @@ public MonetaryAmount getSalary() {
public void setSalary(MonetaryAmount salary) {
this.salary = salary;
}

public String getOther() {
return other;
}

public void setOther(String other) {
this.other = other;
}
}
}

0 comments on commit 73c5f29

Please sign in to comment.