试图找到一个匹配我的erd的模型

时间:2015-08-10 18:03:53

标签: jpa spring-data-jpa

我正在尝试使用JPA持久性对某些对象进行建模,但我很难创建代码,导致数据库结构代表我想要捕获的数据。
enter image description here

我希望数据的示例是

base
----------------
1|100|01/01/2015
2|125|01/01/2015
3|175|01/01/2015

types
----------------
1|1|trusted
2|2|trusted
3|3|trusted
4|1|unknown
5|2|unknown
6|3|unknown

units
----------------
1|4|200|alpha
2|4|145|beta
3|4|561|delta
4|4| 14|sigma
5|5|  8|alpha
6|5| 89|beta

对象定义类似于

@DiscriminatorColumn("type")
abstract class AbstractType {
  Long id;
  int baseRange;
  Date effectiveDate;
  Set<Unit> units;
}
@DiscriminatorValue("trusted")
class Trusted extends AbstractType {
}
@DiscriminatorValue("unknown")
class Unknown extends AbstractType {
}
class Unit {
   Long id;
   @ManyToOne
   AbstractType abstractType;
   int unitValue;
   String attributeValue;
}

这样实例化的Unknown就是

Unknown: {
    id: 5,
    baseRange: 125,
    effectiveDate: '01/01/2015',
    units: [{
        id: 5
        unitValue: 8
        attributeValue: 'alpha'
    }, {
        id: 6
        unitValue: 89
        attributeValue: 'beta'
    }]
}

我知道我在这里留下了许多预期的代码。我只是不确定如何创建模型。我查看@Embedded base,但我不想在types表格中包含这些值。我是在正确的轨道上吗?

1 个答案:

答案 0 :(得分:0)

好的,所以这里的答案与中间对象(type)的保存方式有关。基本上,我需要创建一个覆盖save()方法的存储库的自定义实现。

public Type save(Type type)
{
    LOGGER.debug("save() method called from CustomRepositoryImpl");
    Base base = baseRepository
            .findByBaseRangeAndEffectiveDate(type.getBaseRange(), type.getEffectiveDate());
    if (null != base)
    {
        LOGGER.debug("found existing base id {}", base.getId());
        type.setBase(base);
    }
    return repo.save(type);
}

具有挑战性的部分是此类必须使用@Transactional进行注释,以便它可以访问@PersistenceContext private EntityManager entityManager;

此外,代码中的repo是一个封装的存储库,我使用init()方法(Spring调用)实例化。

public void init()
{
    JpaEntityInformation<Type, Long> newEntityInfo =
            new JpaMetamodelEntityInformation<Type, Long>(Type.class, entityManager.getMetamodel());
    repo = new SimpleJpaRepository<Type, Long>(newEntityInfo , entityManager);
}

我宁愿通过继承来做到这一点,但我无法弄清楚如何做到这一点。