【问题标题】:map only one column in a JoinTable relation仅映射 JoinTable 关系中的一列
【发布时间】:2019-02-05 03:37:51
【问题描述】:

我有 3 张桌子:

业务角色

  • 标识符
  • 姓名

BusinessRole_ActorType(链接表)

  • role_identifier
  • actorType_identifier

演员类型

  • 标识符
  • 名称(varchar)

我需要创建一个 JPA 实体 BusinessRole,它连接表并提供实体中的 actorType 列表,同时仅使用 ActorType 表中的名称。

我知道我可以通过创建一个ActorType 实体并添加一个带有@JoinTable@ManyToMany 来实现类似的结果,但这会添加一个额外的对象,我只对字符串值感兴趣。

下面的代码显示了我想要实现的目标。

@Entity
public class BusinessRole {

    //TODO: Fill in with appropriate annotations :)
    @ManyToMany
    @JoinTable(....)
    private List<String> assignableActorTypes;
}

提前感谢您的支持。

【问题讨论】:

  • 你找到解决办法了吗?

标签: java hibernate jpa entity


【解决方案1】:

如果您不为 ActorType 创建任何实体,hibernate 将无法访问该表,因为 hibernate 无法知道它的存在。

如果您真的不想为 ActorType 创建模型,那么您可以使用原生 SQL 查询。但一定要检查 SQL 注入,因为原生 sql 查询更容易受到此类攻击。

但我认为没有任何可能的方式来拥有列表,就像你正在寻找的那样。

【讨论】:

  • 我不同意你的说法。例如 @CollectionTable(name = "table_name" ...) 或 @JoinTable(name="table_name" ..) 都使用没有创建实体的表。我想要达到的目标可能是不可能的,但我认为这不是原因。坦率地说,我不明白为什么这是不可能的,这是一个正常的情况,从我的观点来看应该由@CollectionTable 解决,因为这是 CollectionTable 的规范化
  • @Alex Escu 同意,但是您在相关实体的字段上使用“@CollectionTable”和“@joinTable”,有关系。此外,当我们使用“@joinTable”时,映射表仅包含 2 个字段(两个表的主标识符)。如果我们需要在该映射表中拥有更多列,我认为如果不创建新的映射实体就无法做到。而您正在寻找的是将实体映射到表/实体的列/字段,而不是实体本身
  • @AlexEscu '但我不认为这是原因' - 你是绝对正确的。不可能的原因很简单,真的:任何有自己身份的东西,根据定义,都是一个实体。因为ActorType 有一个identifier,所以它只能被建模为一个
  • 可以这样想:您的一个实体与(1, 'ActorOne'), (2, 'ActorOne')assignableActorTypes 相关联。然后,您从集合中删除 "ActorOne" 字符串之一,并更新实体。 JPA 是否应该删除与(1, 'ActorOne')(2, 'ActorOne') 的关联?它应该怎么知道?
猜你喜欢
  • 2016-01-23
  • 2014-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-10
  • 2014-09-23
  • 1970-01-01
相关资源
最近更新 更多