猜猜这可能是一个困难的。好吧,至少对我来说。我需要 JPA/Hibernate-Annotations 方面的帮助,我想知道是否有办法解决我的问题。不幸的是,我自己的技能似乎太有限,无法自己解决这个问题。这就是为什么我希望在这里找到可能对 jpa 注释和关系数据库(这里:oracle)有很好的掌握的人。
任务:
我有三个表(见附图!请不要更改这部分,因为不应该创建表!它们已经以这些名称存在,可能不会更改,主键 + 外键部分只是提供有关我在此处作为图像上传的这些现有表格的更多信息!谢谢。):
CONSTANT (PRIMARY KEY CONSTANT(ID) + FOREIGN KEY (PARENT_CONSTANT_ID) REFERENCES CONSTANT(ID)),
COUNTRY (PRIMARY KEY COUNTRY(ID)),
COUNTRY_TO_CONSTANT (PRIMARY KEY COUNTRY_TO_CONSTANT(COUNTRY_ID, CONSTANT_ID))
如此处所示:表格-图像
Java Bean 看起来像这样:
常量.java
@Id
@Column(name = "ID")
private Integer id;
@Basic
@Column(name = "CODE")
private String code;
@Basic
@Column(name = "SORT_KEY")
private int sortKey;
@ManyToOne
@JoinColumn(name = "CONSTANT_TYPE_ID", referencedColumnName = "ID")
private ConstantType constantType;
@ManyToOne
@JoinColumn(name = "parent_constant_id", referencedColumnName = "ID")
private Constant parent;
@OneToMany(mappedBy = "parent", targetEntity = Constant.class)
private List children;
...
public Collection<Constant> getChildren() {
return children;
}
CountryToConstant.java
@Id
@Basic
@Column( name = "COUNTRY_ID" )
private Integer countryID;
@Id
@Basic
@Column( name = "CONSTANT_ID" )
private Integer constantID;
国家.java
@Id
@Column( name = "ID" )
@SequenceGenerator( name = "CountrySequence", sequenceName = "COUNTRY_ID_SEQ" )
@GeneratedValue( generator = "CountrySequence" )
private Integer id;
@Basic
@Column( name = "CODE" )
private String code;
@Basic
@Column( name = "NAME" )
private String name;
@Basic
@Column( name = "LANGUAGE_CODES" )
private String languageCodes;
为简洁起见,我省略了所有 getter + setter,除了“children”属性的 constant.java-getter,因为这是此问题所需的唯一 getter。让它变得更加困难:上面显示的java-beans的结构可能不会改变,但允许扩展。这是由于没有破坏已经存在的(非常复杂的)程序结构。
private List children
(Constant.java) 由属性映射private Constant parent
。让我们假设通过另一个程序逻辑,此处使用具有“父”常量 ID(例如 id = {11, 12})的列表来迭代并一个接一个地移交以创建 1 个父对象。结果,这将创建一个private List children
接一个。因此,由于迭代,该示例的结果将是 2 个单独的子列表:
- 父 ID 11 -> 子 ID 列表:{111、112、113、114、115、116}
- 每个父对象的 id 12 -> id-list: {121, 122, 123})。
我需要得到的是一个与表格相对应的特定列表COUNTRY_TO_CONSTANT
,只能通过使用注释来获得。例如:如果此人在德国使用浏览器,则区域设置为de_DE
“ COUNTRY.id
1001”。并且(仅)基于国家代码(而不是语言环境),上面迭代示例的结果(CONSTANT.id
= {11, 12})应该是这两个列表:
- parent-id 11 -> children-id-list: {111, 112, 113}(省略常量 id 114、115 和 116)
- parent-id 12 -> children-id-list: {121}(省略常量 id 122 和 123)
想法是根据国家代码和CONSTANT.ID
表中的 s COUNTRY_TO_CONSTANT
,每个列表都是单独创建的,对应于相关的数据库条目。
由于private List children
无法在定义中更改,我需要的是第二个属性(例如private List children2
),它的工作原理private List children
与唯一的区别是只有与国家相关的子项(COUNTRY_TO_CONSTANT
见表)应该由private Constant parent
.
我在想类似的事情:
@OneToMany(mappedBy = "parent", targetEntity = Constant.class)
//Any annotation to get what I need.
private List children2
或者可能:
@ManyToMany(mappedBy = "children", targetEntity = Constant.class)
//Any annotation to get what I need.
private Set children2
这甚至可以通过使用注释来实现吗?
希望,到目前为止,事情已经清楚地解释了。如果没有,我可以在这里使用什么样的解决方法?如果缺少任何信息,请告诉我。
非常感谢。