我正在尝试使用JPA持久性对某些对象进行建模,但我很难创建代码,导致数据库结构代表我想要捕获的数据。
我希望数据的示例是
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
表格中包含这些值。我是在正确的轨道上吗?
答案 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);
}
我宁愿通过继承来做到这一点,但我无法弄清楚如何做到这一点。